@alishenriques/design-system 0.5.0 → 0.6.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.
package/README.md CHANGED
@@ -35,10 +35,12 @@ yarn dev # build em watch
35
35
  - `LoadingButton` — botão com estado de carregamento embutido (`isLoading`, `loadingText`)
36
36
  - `Panel` — superfície elevada com borda, com fundo em grade de pontos opcional
37
37
  - `PipelineBadges` — chips estilo pipeline de CI
38
- - `Quote` — citação em destaque estilo terminal (`#`/marcador customizável, cursor piscando opcional)
38
+ - `Quote` — citação em destaque estilo terminal (`#`/marcador customizável, cursor piscando opcional, `float` para puxar para a lateral)
39
+ - `SidePanel` — painel lateral deslizante estilo GitKraken (`open`/`onClose` controlados, fecha no ×/Escape/clique fora)
39
40
  - `StatGrid` — grade de estatísticas
40
41
  - `TagList` — lista de tags
41
42
  - `TerminalPrompt` — linha de prompt de terminal com cursor piscando
43
+ - `Timeline` — grafo vertical estilo GitKraken (nós empilhados e clicáveis, ligados por linhas coloridas em rotação automática)
42
44
 
43
45
  Estilos via CSS Modules e tokens `--ds-*` (`src/tokens.css`).
44
46
 
@@ -0,0 +1,18 @@
1
+ import { HTMLAttributes, ReactNode } from 'react';
2
+ export type SidePanelProps = {
3
+ open: boolean;
4
+ onClose: () => void;
5
+ /** Accessible label for the dialog, e.g. the selected item's name. */
6
+ label: string;
7
+ children: ReactNode;
8
+ /** Accessible label for the × button that closes the panel. Default: "Close". */
9
+ closeLabel?: string;
10
+ } & Omit<HTMLAttributes<HTMLDivElement>, "children">;
11
+ /**
12
+ * A lateral drawer that slides in from the right over a dimming backdrop —
13
+ * the GitKraken-style detail panel. Stays mounted while closed (slides
14
+ * off-screen via a CSS transform, `aria-hidden` toggled) so the same
15
+ * transition plays going out, not just coming in. Closed by the × button, a
16
+ * backdrop click, or Escape.
17
+ */
18
+ export declare function SidePanel({ open, onClose, label, children, closeLabel, className, ...props }: SidePanelProps): import("react").JSX.Element;
@@ -0,0 +1,2 @@
1
+ export { SidePanel } from './SidePanel';
2
+ export type { SidePanelProps } from './SidePanel';
@@ -0,0 +1,19 @@
1
+ import { HTMLAttributes } from 'react';
2
+ export type TimelineItem = {
3
+ id: string;
4
+ label: string;
5
+ /** Small square logo shown inside the node. Falls back to the label's first letter. */
6
+ iconUrl?: string | null;
7
+ };
8
+ export type TimelineProps = {
9
+ items: TimelineItem[];
10
+ /** The currently selected item's id, if any. */
11
+ selectedId?: string | null;
12
+ onSelect?: (id: string) => void;
13
+ } & Omit<HTMLAttributes<HTMLOListElement>, "children">;
14
+ /**
15
+ * A vertical, GitKraken-style commit graph: stacked, clickable nodes
16
+ * connected by colored lines, in the order given. Pair with `SidePanel` for
17
+ * the GitKraken-style sliding detail view.
18
+ */
19
+ export declare function Timeline({ items, selectedId, onSelect, className, ...props }: TimelineProps): import("react").JSX.Element;
@@ -0,0 +1,2 @@
1
+ export { Timeline } from './Timeline';
2
+ export type { TimelineItem, TimelineProps } from './Timeline';
@@ -1 +1 @@
1
- :root{--ds-color-bg: #0b0b0f;--ds-color-bg-raised: #131318;--ds-color-fg: #f4f1ea;--ds-color-muted: #9a958c;--ds-color-accent: #c8ff00;--ds-color-accent-ink: #111111;--ds-color-accent-soft: rgba(200, 255, 0, .1);--ds-color-border: rgba(244, 241, 234, .1);--ds-color-border-strong: rgba(244, 241, 234, .16);--ds-radius-sm: 8px;--ds-radius-md: 16px;--ds-space-1: .25rem;--ds-space-2: .5rem;--ds-space-3: .75rem;--ds-space-4: 1rem;--ds-space-5: 1.5rem;--ds-space-6: 2rem;--ds-space-8: 3rem;--ds-font-sans: "IBM Plex Sans", system-ui, -apple-system, sans-serif;--ds-font-mono: "IBM Plex Mono", ui-monospace, "SF Mono", Menlo, monospace;--ds-font-display: "Archivo", system-ui, -apple-system, sans-serif;--ds-motion-fast: .18s cubic-bezier(.22, 1, .36, 1)}.ds-dot-grid{background-image:radial-gradient(circle at 1px 1px,var(--ds-color-border-strong) 1px,transparent 0);background-size:22px 22px}._trigger_e3bgf_1{display:inline-flex;padding:0;border:2px solid var(--ds-color-accent);border-radius:50%;overflow:hidden;cursor:pointer;background:var(--ds-color-bg-raised);transition:transform var(--ds-motion-fast),box-shadow var(--ds-motion-fast)}._trigger_e3bgf_1:hover,._trigger_e3bgf_1:focus-visible{transform:scale(1.03);outline:none;box-shadow:0 0 0 4px var(--ds-color-accent-soft)}._image_e3bgf_19{width:100%;height:100%;object-fit:cover;display:block}._backdrop_e3bgf_26{position:fixed;inset:0;z-index:100;display:flex;align-items:center;justify-content:center;padding:24px;background:#0b0b0fb8;-webkit-backdrop-filter:blur(20px);backdrop-filter:blur(20px);opacity:0;transition:opacity .22s ease-out}._backdropVisible_e3bgf_48{opacity:1}._frame_e3bgf_55{position:relative;opacity:0;transition:opacity .26s ease-out}._frameVisible_e3bgf_61{opacity:1}._circle_e3bgf_53{position:absolute;inset:0;border-radius:50%;overflow:hidden;border:3px solid var(--ds-color-accent);box-shadow:0 20px 60px #00000080;transform:scale(.85);transition:transform .26s cubic-bezier(.22,1,.36,1)}._frameVisible_e3bgf_61 ._circle_e3bgf_53{transform:scale(1)}._expandedImage_e3bgf_80{width:100%;height:100%;object-fit:cover;display:block}._closeButton_e3bgf_87{position:absolute;top:-10px;right:-10px;display:flex;align-items:center;justify-content:center;width:36px;height:36px;border-radius:50%;border:1px solid var(--ds-color-border-strong);background:var(--ds-color-bg-raised);color:var(--ds-color-fg);font-size:20px;line-height:1;cursor:pointer;transition:border-color var(--ds-motion-fast),color var(--ds-motion-fast)}._closeButton_e3bgf_87:hover,._closeButton_e3bgf_87:focus-visible{border-color:var(--ds-color-accent);color:var(--ds-color-accent);outline:none}@media(prefers-reduced-motion:reduce){._backdrop_e3bgf_26,._frame_e3bgf_55,._circle_e3bgf_53{transition:none}}._button_1jhtl_1{display:inline-flex;align-items:center;justify-content:center;gap:var(--ds-space-2);border:0;border-radius:var(--ds-radius-sm);padding:var(--ds-space-3) var(--ds-space-4);font-family:var(--ds-font-sans);font-weight:600;letter-spacing:.01em;cursor:pointer;transition:transform var(--ds-motion-fast),background-color var(--ds-motion-fast),box-shadow var(--ds-motion-fast)}._button_1jhtl_1:hover{transform:translateY(-1px)}._button_1jhtl_1:active{transform:translateY(0)}._button_1jhtl_1:disabled{cursor:not-allowed;opacity:.5;transform:none}._primary_1jhtl_33{background:var(--ds-color-accent);color:var(--ds-color-accent-ink);box-shadow:0 0 0 0 transparent}._primary_1jhtl_33:hover:not(:disabled){box-shadow:0 8px 24px color-mix(in srgb,var(--ds-color-accent) 35%,transparent)}._ghost_1jhtl_43{background:transparent;color:var(--ds-color-fg);box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--ds-color-fg) 22%,transparent)}._trigger_10bud_1{display:inline-flex;align-items:center;gap:8px;border:1px solid var(--ds-color-border-strong);background:var(--ds-color-bg-raised);color:var(--ds-color-muted);padding:7px 12px;border-radius:8px;cursor:pointer;font-family:var(--ds-font-mono);font-size:12px;white-space:nowrap;transition:color var(--ds-motion-fast),border-color var(--ds-motion-fast)}._trigger_10bud_1:hover,._trigger_10bud_1:focus-visible{color:var(--ds-color-fg);border-color:var(--ds-color-accent)}._kbd_10bud_23{background:var(--ds-color-bg);border:1px solid var(--ds-color-border-strong);border-radius:4px;padding:1px 5px;font-family:var(--ds-font-mono)}._backdrop_10bud_31{position:fixed;inset:0;background:#0b0b0fb3;display:flex;align-items:flex-start;justify-content:center;padding:14vh 16px 16px;z-index:100}._dialog_10bud_42{width:100%;max-width:520px;background:var(--ds-color-bg-raised);border:1px solid var(--ds-color-border-strong);border-radius:12px;overflow:hidden;font-family:var(--ds-font-mono);box-shadow:0 20px 60px #00000080}._input_10bud_53{width:100%;background:transparent;border:0;border-bottom:1px solid var(--ds-color-border);color:var(--ds-color-fg);padding:16px 18px;font-family:var(--ds-font-mono);font-size:14px;outline:none}._input_10bud_53::placeholder{color:var(--ds-color-muted)}._list_10bud_69{list-style:none;margin:0;padding:8px;max-height:280px;overflow:auto}._list_10bud_69 a{display:flex;justify-content:space-between;gap:10px;padding:10px 12px;border-radius:8px;text-decoration:none;color:var(--ds-color-fg);font-size:13px}._list_10bud_69 a:hover,._list_10bud_69 a:focus-visible{background:var(--ds-color-accent-soft);color:var(--ds-color-accent)}._list_10bud_69 small{color:var(--ds-color-muted);font-size:11px}._eyebrow_1a4gy_1{margin:0;font-family:var(--ds-font-mono);font-weight:500;font-size:12px;letter-spacing:.08em;text-transform:uppercase;color:var(--ds-color-muted)}._loadingLabel_1yug9_1{display:flex;align-items:center;justify-content:center;gap:4px;font-family:var(--ds-font-mono);text-transform:lowercase}._cursor_1yug9_10{display:inline-block;width:7px;height:14px;background:var(--ds-color-accent);animation:_blink_1yug9_1 1s step-end infinite}@media(prefers-reduced-motion:reduce){._cursor_1yug9_10{animation:none}}@keyframes _blink_1yug9_1{50%{opacity:0}}._panel_m16j3_1{position:relative;border:1px solid var(--ds-color-border);border-radius:var(--ds-radius-md);background:var(--ds-color-bg-raised);padding:clamp(28px,5vw,64px)}._list_27va3_1{display:flex;flex-wrap:wrap;gap:var(--ds-space-2);margin:0;padding:0;list-style:none;font-family:var(--ds-font-mono);font-size:12px}._step_27va3_12{display:inline-flex;align-items:center;gap:6px;border:1px solid var(--ds-color-border-strong);border-radius:6px;padding:6px 10px;color:var(--ds-color-muted)}._step_27va3_12 b{color:var(--ds-color-accent);font-weight:600}._quote_sjisa_1{display:flex;align-items:flex-start;gap:var(--ds-space-3);margin:0;border-left:3px solid var(--ds-color-accent);border-radius:0 var(--ds-radius-sm) var(--ds-radius-sm) 0;background:var(--ds-color-accent-soft);padding:var(--ds-space-4) var(--ds-space-5)}@media(min-width:640px){._floatLeft_sjisa_13,._floatRight_sjisa_14{max-width:320px;margin-top:4px;margin-bottom:16px}._floatLeft_sjisa_13{float:left;margin-right:24px}._floatRight_sjisa_14{float:right;margin-left:24px}}._marker_sjisa_31{flex-shrink:0;font-family:var(--ds-font-mono);font-weight:600;color:var(--ds-color-accent)}._text_sjisa_38{margin:0;font-family:var(--ds-font-mono);font-size:15px;line-height:1.6;color:var(--ds-color-fg)}._cursor_sjisa_46{display:inline-block;width:8px;height:15px;margin-left:4px;vertical-align:text-bottom;background:var(--ds-color-accent);animation:_blink_sjisa_1 1s step-end infinite}@media(prefers-reduced-motion:reduce){._cursor_sjisa_46{animation:none}}@keyframes _blink_sjisa_1{50%{opacity:0}}._grid_94gwu_1{display:grid;grid-template-columns:repeat(2,1fr);gap:1px;margin:0;background:var(--ds-color-border);border:1px solid var(--ds-color-border);border-radius:10px;overflow:hidden}._cell_94gwu_12{background:var(--ds-color-bg-raised);padding:var(--ds-space-4);display:flex;flex-direction:column-reverse}._value_94gwu_19{margin:0;font-family:var(--ds-font-mono);font-weight:700;font-size:22px;color:var(--ds-color-fg);font-variant-numeric:tabular-nums}._label_94gwu_28{font-family:var(--ds-font-mono);font-size:11px;color:var(--ds-color-muted);text-transform:uppercase;letter-spacing:.04em}._list_17qxg_1{display:flex;flex-wrap:wrap;gap:var(--ds-space-2);margin:0;padding:0;list-style:none}._tag_17qxg_10{font-family:var(--ds-font-mono);font-size:12px;color:var(--ds-color-fg);border:1px solid var(--ds-color-border-strong);border-radius:999px;padding:6px 12px}._prompt_vxkw7_1{margin:0;display:flex;align-items:center;gap:2px;font-family:var(--ds-font-mono);font-size:13px;color:var(--ds-color-accent)}._path_vxkw7_11{color:var(--ds-color-muted)}._cursor_vxkw7_15{display:inline-block;width:7px;height:15px;margin-left:2px;background:var(--ds-color-accent);animation:_blink_vxkw7_1 1.1s step-end infinite}@media(prefers-reduced-motion:reduce){._cursor_vxkw7_15{animation:none;opacity:.7}}@keyframes _blink_vxkw7_1{50%{opacity:0}}
1
+ :root{--ds-color-bg: #0b0b0f;--ds-color-bg-raised: #131318;--ds-color-fg: #f4f1ea;--ds-color-muted: #9a958c;--ds-color-accent: #c8ff00;--ds-color-accent-ink: #111111;--ds-color-accent-soft: rgba(200, 255, 0, .1);--ds-color-border: rgba(244, 241, 234, .1);--ds-color-border-strong: rgba(244, 241, 234, .16);--ds-radius-sm: 8px;--ds-radius-md: 16px;--ds-space-1: .25rem;--ds-space-2: .5rem;--ds-space-3: .75rem;--ds-space-4: 1rem;--ds-space-5: 1.5rem;--ds-space-6: 2rem;--ds-space-8: 3rem;--ds-font-sans: "IBM Plex Sans", system-ui, -apple-system, sans-serif;--ds-font-mono: "IBM Plex Mono", ui-monospace, "SF Mono", Menlo, monospace;--ds-font-display: "Archivo", system-ui, -apple-system, sans-serif;--ds-motion-fast: .18s cubic-bezier(.22, 1, .36, 1)}.ds-dot-grid{background-image:radial-gradient(circle at 1px 1px,var(--ds-color-border-strong) 1px,transparent 0);background-size:22px 22px}._trigger_e3bgf_1{display:inline-flex;padding:0;border:2px solid var(--ds-color-accent);border-radius:50%;overflow:hidden;cursor:pointer;background:var(--ds-color-bg-raised);transition:transform var(--ds-motion-fast),box-shadow var(--ds-motion-fast)}._trigger_e3bgf_1:hover,._trigger_e3bgf_1:focus-visible{transform:scale(1.03);outline:none;box-shadow:0 0 0 4px var(--ds-color-accent-soft)}._image_e3bgf_19{width:100%;height:100%;object-fit:cover;display:block}._backdrop_e3bgf_26{position:fixed;inset:0;z-index:100;display:flex;align-items:center;justify-content:center;padding:24px;background:#0b0b0fb8;-webkit-backdrop-filter:blur(20px);backdrop-filter:blur(20px);opacity:0;transition:opacity .22s ease-out}._backdropVisible_e3bgf_48{opacity:1}._frame_e3bgf_55{position:relative;opacity:0;transition:opacity .26s ease-out}._frameVisible_e3bgf_61{opacity:1}._circle_e3bgf_53{position:absolute;inset:0;border-radius:50%;overflow:hidden;border:3px solid var(--ds-color-accent);box-shadow:0 20px 60px #00000080;transform:scale(.85);transition:transform .26s cubic-bezier(.22,1,.36,1)}._frameVisible_e3bgf_61 ._circle_e3bgf_53{transform:scale(1)}._expandedImage_e3bgf_80{width:100%;height:100%;object-fit:cover;display:block}._closeButton_e3bgf_87{position:absolute;top:-10px;right:-10px;display:flex;align-items:center;justify-content:center;width:36px;height:36px;border-radius:50%;border:1px solid var(--ds-color-border-strong);background:var(--ds-color-bg-raised);color:var(--ds-color-fg);font-size:20px;line-height:1;cursor:pointer;transition:border-color var(--ds-motion-fast),color var(--ds-motion-fast)}._closeButton_e3bgf_87:hover,._closeButton_e3bgf_87:focus-visible{border-color:var(--ds-color-accent);color:var(--ds-color-accent);outline:none}@media(prefers-reduced-motion:reduce){._backdrop_e3bgf_26,._frame_e3bgf_55,._circle_e3bgf_53{transition:none}}._button_1jhtl_1{display:inline-flex;align-items:center;justify-content:center;gap:var(--ds-space-2);border:0;border-radius:var(--ds-radius-sm);padding:var(--ds-space-3) var(--ds-space-4);font-family:var(--ds-font-sans);font-weight:600;letter-spacing:.01em;cursor:pointer;transition:transform var(--ds-motion-fast),background-color var(--ds-motion-fast),box-shadow var(--ds-motion-fast)}._button_1jhtl_1:hover{transform:translateY(-1px)}._button_1jhtl_1:active{transform:translateY(0)}._button_1jhtl_1:disabled{cursor:not-allowed;opacity:.5;transform:none}._primary_1jhtl_33{background:var(--ds-color-accent);color:var(--ds-color-accent-ink);box-shadow:0 0 0 0 transparent}._primary_1jhtl_33:hover:not(:disabled){box-shadow:0 8px 24px color-mix(in srgb,var(--ds-color-accent) 35%,transparent)}._ghost_1jhtl_43{background:transparent;color:var(--ds-color-fg);box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--ds-color-fg) 22%,transparent)}._trigger_10bud_1{display:inline-flex;align-items:center;gap:8px;border:1px solid var(--ds-color-border-strong);background:var(--ds-color-bg-raised);color:var(--ds-color-muted);padding:7px 12px;border-radius:8px;cursor:pointer;font-family:var(--ds-font-mono);font-size:12px;white-space:nowrap;transition:color var(--ds-motion-fast),border-color var(--ds-motion-fast)}._trigger_10bud_1:hover,._trigger_10bud_1:focus-visible{color:var(--ds-color-fg);border-color:var(--ds-color-accent)}._kbd_10bud_23{background:var(--ds-color-bg);border:1px solid var(--ds-color-border-strong);border-radius:4px;padding:1px 5px;font-family:var(--ds-font-mono)}._backdrop_10bud_31{position:fixed;inset:0;background:#0b0b0fb3;display:flex;align-items:flex-start;justify-content:center;padding:14vh 16px 16px;z-index:100}._dialog_10bud_42{width:100%;max-width:520px;background:var(--ds-color-bg-raised);border:1px solid var(--ds-color-border-strong);border-radius:12px;overflow:hidden;font-family:var(--ds-font-mono);box-shadow:0 20px 60px #00000080}._input_10bud_53{width:100%;background:transparent;border:0;border-bottom:1px solid var(--ds-color-border);color:var(--ds-color-fg);padding:16px 18px;font-family:var(--ds-font-mono);font-size:14px;outline:none}._input_10bud_53::placeholder{color:var(--ds-color-muted)}._list_10bud_69{list-style:none;margin:0;padding:8px;max-height:280px;overflow:auto}._list_10bud_69 a{display:flex;justify-content:space-between;gap:10px;padding:10px 12px;border-radius:8px;text-decoration:none;color:var(--ds-color-fg);font-size:13px}._list_10bud_69 a:hover,._list_10bud_69 a:focus-visible{background:var(--ds-color-accent-soft);color:var(--ds-color-accent)}._list_10bud_69 small{color:var(--ds-color-muted);font-size:11px}._eyebrow_1a4gy_1{margin:0;font-family:var(--ds-font-mono);font-weight:500;font-size:12px;letter-spacing:.08em;text-transform:uppercase;color:var(--ds-color-muted)}._loadingLabel_1yug9_1{display:flex;align-items:center;justify-content:center;gap:4px;font-family:var(--ds-font-mono);text-transform:lowercase}._cursor_1yug9_10{display:inline-block;width:7px;height:14px;background:var(--ds-color-accent);animation:_blink_1yug9_1 1s step-end infinite}@media(prefers-reduced-motion:reduce){._cursor_1yug9_10{animation:none}}@keyframes _blink_1yug9_1{50%{opacity:0}}._panel_m16j3_1{position:relative;border:1px solid var(--ds-color-border);border-radius:var(--ds-radius-md);background:var(--ds-color-bg-raised);padding:clamp(28px,5vw,64px)}._list_27va3_1{display:flex;flex-wrap:wrap;gap:var(--ds-space-2);margin:0;padding:0;list-style:none;font-family:var(--ds-font-mono);font-size:12px}._step_27va3_12{display:inline-flex;align-items:center;gap:6px;border:1px solid var(--ds-color-border-strong);border-radius:6px;padding:6px 10px;color:var(--ds-color-muted)}._step_27va3_12 b{color:var(--ds-color-accent);font-weight:600}._quote_sjisa_1{display:flex;align-items:flex-start;gap:var(--ds-space-3);margin:0;border-left:3px solid var(--ds-color-accent);border-radius:0 var(--ds-radius-sm) var(--ds-radius-sm) 0;background:var(--ds-color-accent-soft);padding:var(--ds-space-4) var(--ds-space-5)}@media(min-width:640px){._floatLeft_sjisa_13,._floatRight_sjisa_14{max-width:320px;margin-top:4px;margin-bottom:16px}._floatLeft_sjisa_13{float:left;margin-right:24px}._floatRight_sjisa_14{float:right;margin-left:24px}}._marker_sjisa_31{flex-shrink:0;font-family:var(--ds-font-mono);font-weight:600;color:var(--ds-color-accent)}._text_sjisa_38{margin:0;font-family:var(--ds-font-mono);font-size:15px;line-height:1.6;color:var(--ds-color-fg)}._cursor_sjisa_46{display:inline-block;width:8px;height:15px;margin-left:4px;vertical-align:text-bottom;background:var(--ds-color-accent);animation:_blink_sjisa_1 1s step-end infinite}@media(prefers-reduced-motion:reduce){._cursor_sjisa_46{animation:none}}@keyframes _blink_sjisa_1{50%{opacity:0}}._backdrop_ihclc_1{position:fixed;inset:0;z-index:60;background:#0009;opacity:0;pointer-events:none;transition:opacity var(--ds-motion-fast)}._backdropVisible_ihclc_11{opacity:1;pointer-events:auto}._panel_ihclc_16{position:fixed;top:0;right:0;bottom:0;z-index:61;display:flex;flex-direction:column;width:min(420px,100vw);overflow-y:auto;background:var(--ds-color-bg-raised);border-left:1px solid var(--ds-color-border-strong);box-shadow:-24px 0 48px #00000073;padding:var(--ds-space-6) var(--ds-space-5);padding-top:calc(var(--ds-space-6) + env(safe-area-inset-top,0px));transform:translate(100%);transition:transform var(--ds-motion-fast)}._panelOpen_ihclc_35{transform:translate(0)}._closeButton_ihclc_39{align-self:flex-end;display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;border:1px solid var(--ds-color-border-strong);border-radius:999px;background:none;color:var(--ds-color-muted);cursor:pointer;font-size:18px;line-height:1;flex:none}._closeButton_ihclc_39:hover{color:var(--ds-color-fg)}._content_ihclc_60{display:flex;flex-direction:column;gap:var(--ds-space-4);margin-top:var(--ds-space-5)}._grid_94gwu_1{display:grid;grid-template-columns:repeat(2,1fr);gap:1px;margin:0;background:var(--ds-color-border);border:1px solid var(--ds-color-border);border-radius:10px;overflow:hidden}._cell_94gwu_12{background:var(--ds-color-bg-raised);padding:var(--ds-space-4);display:flex;flex-direction:column-reverse}._value_94gwu_19{margin:0;font-family:var(--ds-font-mono);font-weight:700;font-size:22px;color:var(--ds-color-fg);font-variant-numeric:tabular-nums}._label_94gwu_28{font-family:var(--ds-font-mono);font-size:11px;color:var(--ds-color-muted);text-transform:uppercase;letter-spacing:.04em}._list_17qxg_1{display:flex;flex-wrap:wrap;gap:var(--ds-space-2);margin:0;padding:0;list-style:none}._tag_17qxg_10{font-family:var(--ds-font-mono);font-size:12px;color:var(--ds-color-fg);border:1px solid var(--ds-color-border-strong);border-radius:999px;padding:6px 12px}._prompt_vxkw7_1{margin:0;display:flex;align-items:center;gap:2px;font-family:var(--ds-font-mono);font-size:13px;color:var(--ds-color-accent)}._path_vxkw7_11{color:var(--ds-color-muted)}._cursor_vxkw7_15{display:inline-block;width:7px;height:15px;margin-left:2px;background:var(--ds-color-accent);animation:_blink_vxkw7_1 1.1s step-end infinite}@media(prefers-reduced-motion:reduce){._cursor_vxkw7_15{animation:none;opacity:.7}}@keyframes _blink_vxkw7_1{50%{opacity:0}}._list_nynky_1{--timeline-node-size: 48px;list-style:none;margin:0;padding:0;display:flex;flex-direction:column}._row_nynky_10{position:relative;padding-bottom:var(--ds-space-5)}._row_nynky_10:last-child{padding-bottom:0}._line_nynky_19{position:absolute;top:var(--timeline-node-size);bottom:0;left:calc(var(--timeline-node-size) / 2 - 1px);width:2px;background:var(--timeline-color);opacity:.55}._button_nynky_29{display:flex;align-items:center;gap:var(--ds-space-4);width:100%;background:none;border:0;padding:0;cursor:pointer;font-family:var(--ds-font-sans);text-align:left}._node_nynky_42{flex:none;display:flex;align-items:center;justify-content:center;width:var(--timeline-node-size);height:var(--timeline-node-size);border-radius:50%;background:var(--ds-color-bg-raised);border:2px solid var(--timeline-color);box-shadow:0 0 0 4px var(--ds-color-bg);overflow:hidden;transition:transform var(--ds-motion-fast),box-shadow var(--ds-motion-fast)}._button_nynky_29:hover ._node_nynky_42,._button_nynky_29:focus-visible ._node_nynky_42{transform:scale(1.06)}._nodeSelected_nynky_64{box-shadow:0 0 0 4px var(--ds-color-bg),0 0 0 7px var(--timeline-color)}._icon_nynky_68{width:100%;height:100%;object-fit:cover}._fallback_nynky_74{font-family:var(--ds-font-mono);font-weight:700;font-size:16px;color:var(--timeline-color)}._label_nynky_81{font-size:15px;font-weight:500;color:var(--ds-color-fg)}._button_nynky_29:focus-visible{outline:2px solid var(--ds-color-accent);outline-offset:4px;border-radius:var(--ds-radius-sm)}
package/dist/index.d.ts CHANGED
@@ -14,9 +14,13 @@ export { PipelineBadges } from './components/PipelineBadges';
14
14
  export type { PipelineBadgesProps, PipelineStep } from './components/PipelineBadges';
15
15
  export { Quote } from './components/Quote';
16
16
  export type { QuoteProps } from './components/Quote';
17
+ export { SidePanel } from './components/SidePanel';
18
+ export type { SidePanelProps } from './components/SidePanel';
17
19
  export { StatGrid } from './components/StatGrid';
18
20
  export type { Stat, StatGridProps } from './components/StatGrid';
19
21
  export { TagList } from './components/TagList';
20
22
  export type { TagListProps } from './components/TagList';
21
23
  export { TerminalPrompt } from './components/TerminalPrompt';
22
24
  export type { TerminalPromptProps } from './components/TerminalPrompt';
25
+ export { Timeline } from './components/Timeline';
26
+ export type { TimelineItem, TimelineProps } from './components/Timeline';
package/dist/index.js CHANGED
@@ -1,89 +1,89 @@
1
1
  "use client";
2
- import { jsxs as r, Fragment as E, jsx as e } from "react/jsx-runtime";
3
- import { useState as v, useEffect as B, useRef as V } from "react";
4
- const A = "_trigger_e3bgf_1", T = "_image_e3bgf_19", D = "_backdrop_e3bgf_26", F = "_backdropVisible_e3bgf_48", I = "_frame_e3bgf_55", R = "_frameVisible_e3bgf_61", K = "_circle_e3bgf_53", O = "_expandedImage_e3bgf_80", P = "_closeButton_e3bgf_87", u = {
5
- trigger: A,
2
+ import { jsxs as r, Fragment as L, jsx as e } from "react/jsx-runtime";
3
+ import { useState as w, useEffect as $, useRef as O } from "react";
4
+ const q = "_trigger_e3bgf_1", T = "_image_e3bgf_19", F = "_backdrop_e3bgf_26", I = "_backdropVisible_e3bgf_48", K = "_frame_e3bgf_55", R = "_frameVisible_e3bgf_61", P = "_circle_e3bgf_53", U = "_expandedImage_e3bgf_80", G = "_closeButton_e3bgf_87", m = {
5
+ trigger: q,
6
6
  image: T,
7
- backdrop: D,
8
- backdropVisible: F,
9
- frame: I,
7
+ backdrop: F,
8
+ backdropVisible: I,
9
+ frame: K,
10
10
  frameVisible: R,
11
- circle: K,
12
- expandedImage: O,
13
- closeButton: P
14
- }, Q = 96, U = "min(70vw, 60vh, 440px)";
15
- function Ce({
16
- src: t,
17
- alt: a,
18
- size: o = Q,
19
- expandedSize: n = U,
20
- objectPosition: s = "center",
21
- closeLabel: c = "Close",
22
- className: i,
11
+ circle: P,
12
+ expandedImage: U,
13
+ closeButton: G
14
+ }, Q = 96, Z = "min(70vw, 60vh, 440px)";
15
+ function Qe({
16
+ src: n,
17
+ alt: t,
18
+ size: s = Q,
19
+ expandedSize: l = Z,
20
+ objectPosition: o = "center",
21
+ closeLabel: i = "Close",
22
+ className: a,
23
23
  ...d
24
24
  }) {
25
- const [_, f] = v(!1), [h, y] = v(!1);
26
- B(() => {
25
+ const [_, u] = w(!1), [b, h] = w(!1);
26
+ $(() => {
27
27
  if (!_) return;
28
- function b(S) {
29
- S.key === "Escape" && f(!1);
28
+ function y(D) {
29
+ D.key === "Escape" && u(!1);
30
30
  }
31
- document.addEventListener("keydown", b);
32
- const w = document.body.style.overflow;
31
+ document.addEventListener("keydown", y);
32
+ const j = document.body.style.overflow;
33
33
  document.body.style.overflow = "hidden";
34
- const q = requestAnimationFrame(() => y(!0));
34
+ const A = requestAnimationFrame(() => h(!0));
35
35
  return () => {
36
- document.removeEventListener("keydown", b), document.body.style.overflow = w, cancelAnimationFrame(q), y(!1);
36
+ document.removeEventListener("keydown", y), document.body.style.overflow = j, cancelAnimationFrame(A), h(!1);
37
37
  };
38
38
  }, [_]);
39
- const N = [u.trigger, i].filter(Boolean).join(" "), l = [u.frame, h && u.frameVisible].filter(Boolean).join(" "), m = [u.backdrop, h && u.backdropVisible].filter(Boolean).join(" ");
40
- return /* @__PURE__ */ r(E, { children: [
39
+ const B = [m.trigger, a].filter(Boolean).join(" "), c = [m.frame, b && m.frameVisible].filter(Boolean).join(" "), f = [m.backdrop, b && m.backdropVisible].filter(Boolean).join(" ");
40
+ return /* @__PURE__ */ r(L, { children: [
41
41
  /* @__PURE__ */ e(
42
42
  "button",
43
43
  {
44
44
  type: "button",
45
- className: N,
46
- style: { width: o, height: o },
47
- onClick: () => f(!0),
45
+ className: B,
46
+ style: { width: s, height: s },
47
+ onClick: () => u(!0),
48
48
  "aria-haspopup": "dialog",
49
49
  ...d,
50
50
  children: /* @__PURE__ */ e(
51
51
  "img",
52
52
  {
53
- src: t,
54
- alt: a,
55
- className: u.image,
56
- style: { objectPosition: s },
53
+ src: n,
54
+ alt: t,
55
+ className: m.image,
56
+ style: { objectPosition: o },
57
57
  loading: "lazy"
58
58
  }
59
59
  )
60
60
  }
61
61
  ),
62
- _ && /* @__PURE__ */ e("div", { className: m, onClick: (b) => b.target === b.currentTarget && f(!1), children: /* @__PURE__ */ r(
62
+ _ && /* @__PURE__ */ e("div", { className: f, onClick: (y) => y.target === y.currentTarget && u(!1), children: /* @__PURE__ */ r(
63
63
  "div",
64
64
  {
65
- className: l,
66
- style: { width: n, height: n },
65
+ className: c,
66
+ style: { width: l, height: l },
67
67
  role: "dialog",
68
68
  "aria-modal": "true",
69
- "aria-label": a,
69
+ "aria-label": t,
70
70
  children: [
71
- /* @__PURE__ */ e("div", { className: u.circle, children: /* @__PURE__ */ e(
71
+ /* @__PURE__ */ e("div", { className: m.circle, children: /* @__PURE__ */ e(
72
72
  "img",
73
73
  {
74
- src: t,
75
- alt: a,
76
- className: u.expandedImage,
77
- style: { objectPosition: s }
74
+ src: n,
75
+ alt: t,
76
+ className: m.expandedImage,
77
+ style: { objectPosition: o }
78
78
  }
79
79
  ) }),
80
80
  /* @__PURE__ */ e(
81
81
  "button",
82
82
  {
83
83
  type: "button",
84
- className: u.closeButton,
85
- onClick: () => f(!1),
86
- "aria-label": c,
84
+ className: m.closeButton,
85
+ onClick: () => u(!1),
86
+ "aria-label": i,
87
87
  children: "×"
88
88
  }
89
89
  )
@@ -92,221 +92,316 @@ function Ce({
92
92
  ) })
93
93
  ] });
94
94
  }
95
- const Z = "_button_1jhtl_1", G = "_primary_1jhtl_33", X = "_ghost_1jhtl_43", C = {
96
- button: Z,
97
- primary: G,
98
- ghost: X
95
+ const M = "_button_1jhtl_1", X = "_primary_1jhtl_33", z = "_ghost_1jhtl_43", E = {
96
+ button: M,
97
+ primary: X,
98
+ ghost: z
99
99
  };
100
- function $e({
101
- children: t,
102
- variant: a = "primary",
103
- type: o = "button",
104
- className: n,
105
- ...s
100
+ function Ze({
101
+ children: n,
102
+ variant: t = "primary",
103
+ type: s = "button",
104
+ className: l,
105
+ ...o
106
106
  }) {
107
- const c = [C.button, C[a], n].filter(Boolean).join(" ");
108
- return /* @__PURE__ */ e("button", { type: o, className: c, "data-variant": a, ...s, children: t });
107
+ const i = [E.button, E[t], l].filter(Boolean).join(" ");
108
+ return /* @__PURE__ */ e("button", { type: s, className: i, "data-variant": t, ...o, children: n });
109
109
  }
110
- const H = "_trigger_10bud_1", J = "_kbd_10bud_23", M = "_backdrop_10bud_31", W = "_dialog_10bud_42", Y = "_input_10bud_53", z = "_list_10bud_69", g = {
110
+ const H = "_trigger_10bud_1", J = "_kbd_10bud_23", W = "_backdrop_10bud_31", Y = "_dialog_10bud_42", ee = "_input_10bud_53", ne = "_list_10bud_69", g = {
111
111
  trigger: H,
112
112
  kbd: J,
113
- backdrop: M,
114
- dialog: W,
115
- input: Y,
116
- list: z
113
+ backdrop: W,
114
+ dialog: Y,
115
+ input: ee,
116
+ list: ne
117
117
  };
118
- function xe({
119
- items: t,
120
- triggerLabel: a = "Search",
121
- placeholder: o = "Type a command or search…",
122
- label: n = "Command palette",
123
- className: s,
124
- ...c
118
+ function Me({
119
+ items: n,
120
+ triggerLabel: t = "Search",
121
+ placeholder: s = "Type a command or search…",
122
+ label: l = "Command palette",
123
+ className: o,
124
+ ...i
125
125
  }) {
126
- const [i, d] = v(!1), [_, f] = v(""), h = V(null);
127
- B(() => {
128
- i && h.current?.focus();
129
- }, [i]), B(() => {
130
- function l(m) {
131
- if ((m.metaKey || m.ctrlKey) && m.key.toLowerCase() === "k") {
132
- m.preventDefault(), d((w) => !w);
126
+ const [a, d] = w(!1), [_, u] = w(""), b = O(null);
127
+ $(() => {
128
+ a && b.current?.focus();
129
+ }, [a]), $(() => {
130
+ function c(f) {
131
+ if ((f.metaKey || f.ctrlKey) && f.key.toLowerCase() === "k") {
132
+ f.preventDefault(), d((j) => !j);
133
133
  return;
134
134
  }
135
- m.key === "Escape" && d(!1);
135
+ f.key === "Escape" && d(!1);
136
136
  }
137
- return document.addEventListener("keydown", l), () => document.removeEventListener("keydown", l);
137
+ return document.addEventListener("keydown", c), () => document.removeEventListener("keydown", c);
138
138
  }, []);
139
- const y = t.filter((l) => `${l.label} ${l.hint ?? ""}`.toLowerCase().includes(_.trim().toLowerCase())), N = [g.trigger, s].filter(Boolean).join(" ");
140
- return /* @__PURE__ */ r(E, { children: [
141
- /* @__PURE__ */ r("button", { type: "button", className: N, onClick: () => d(!0), ...c, children: [
142
- /* @__PURE__ */ e("span", { children: a }),
139
+ const h = n.filter((c) => `${c.label} ${c.hint ?? ""}`.toLowerCase().includes(_.trim().toLowerCase())), B = [g.trigger, o].filter(Boolean).join(" ");
140
+ return /* @__PURE__ */ r(L, { children: [
141
+ /* @__PURE__ */ r("button", { type: "button", className: B, onClick: () => d(!0), ...i, children: [
142
+ /* @__PURE__ */ e("span", { children: t }),
143
143
  /* @__PURE__ */ e("kbd", { className: g.kbd, children: "⌘K" })
144
144
  ] }),
145
- i && /* @__PURE__ */ e("div", { className: g.backdrop, onClick: (l) => l.target === l.currentTarget && d(!1), children: /* @__PURE__ */ r("div", { className: g.dialog, role: "dialog", "aria-modal": "true", "aria-label": n, children: [
145
+ a && /* @__PURE__ */ e("div", { className: g.backdrop, onClick: (c) => c.target === c.currentTarget && d(!1), children: /* @__PURE__ */ r("div", { className: g.dialog, role: "dialog", "aria-modal": "true", "aria-label": l, children: [
146
146
  /* @__PURE__ */ e(
147
147
  "input",
148
148
  {
149
- ref: h,
149
+ ref: b,
150
150
  type: "text",
151
151
  className: g.input,
152
- placeholder: o,
152
+ placeholder: s,
153
153
  value: _,
154
- onChange: (l) => f(l.target.value),
154
+ onChange: (c) => u(c.target.value),
155
155
  autoComplete: "off"
156
156
  }
157
157
  ),
158
- /* @__PURE__ */ e("ul", { className: g.list, children: y.map((l) => (
158
+ /* @__PURE__ */ e("ul", { className: g.list, children: h.map((c) => (
159
159
  // Keyed by href, not label: two items can share a label (e.g.
160
160
  // a nav link and a more specific shortcut to the same topic).
161
- /* @__PURE__ */ e("li", { children: /* @__PURE__ */ r("a", { href: l.href, onClick: () => d(!1), children: [
162
- /* @__PURE__ */ e("span", { children: l.label }),
163
- l.hint && /* @__PURE__ */ e("small", { children: l.hint })
164
- ] }) }, l.href)
161
+ /* @__PURE__ */ e("li", { children: /* @__PURE__ */ r("a", { href: c.href, onClick: () => d(!1), children: [
162
+ /* @__PURE__ */ e("span", { children: c.label }),
163
+ c.hint && /* @__PURE__ */ e("small", { children: c.hint })
164
+ ] }) }, c.href)
165
165
  )) })
166
166
  ] }) })
167
167
  ] });
168
168
  }
169
- const ee = "_eyebrow_1a4gy_1", te = {
170
- eyebrow: ee
169
+ const te = "_eyebrow_1a4gy_1", oe = {
170
+ eyebrow: te
171
171
  };
172
- function Le({ children: t, className: a, ...o }) {
173
- const n = [te.eyebrow, a].filter(Boolean).join(" ");
174
- return /* @__PURE__ */ e("p", { className: n, ...o, children: t });
172
+ function Xe({ children: n, className: t, ...s }) {
173
+ const l = [oe.eyebrow, t].filter(Boolean).join(" ");
174
+ return /* @__PURE__ */ e("p", { className: l, ...s, children: n });
175
175
  }
176
- const se = "_loadingLabel_1yug9_1", ae = "_cursor_1yug9_10", $ = {
176
+ const se = "_loadingLabel_1yug9_1", le = "_cursor_1yug9_10", x = {
177
177
  loadingLabel: se,
178
- cursor: ae
178
+ cursor: le
179
179
  };
180
- function Ee({
181
- isLoading: t,
182
- loadingText: a,
183
- children: o,
184
- className: n,
185
- style: s,
186
- disabled: c,
187
- type: i = "button",
180
+ function ze({
181
+ isLoading: n,
182
+ loadingText: t,
183
+ children: s,
184
+ className: l,
185
+ style: o,
186
+ disabled: i,
187
+ type: a = "button",
188
188
  ...d
189
189
  }) {
190
- const _ = [n].filter(Boolean).join(" ");
190
+ const _ = [l].filter(Boolean).join(" ");
191
191
  return /* @__PURE__ */ e(
192
192
  "button",
193
193
  {
194
- type: i,
194
+ type: a,
195
195
  className: _,
196
- style: { ...s, ...t ? {
196
+ style: { ...o, ...n ? {
197
197
  background: "var(--ds-color-bg)",
198
198
  border: "1px solid var(--ds-color-accent)",
199
199
  color: "var(--ds-color-accent)",
200
200
  opacity: 1
201
201
  } : void 0 },
202
- disabled: !!c || t,
203
- "aria-busy": t || void 0,
202
+ disabled: !!i || n,
203
+ "aria-busy": n || void 0,
204
204
  ...d,
205
- children: t ? /* @__PURE__ */ r("span", { className: $.loadingLabel, children: [
205
+ children: n ? /* @__PURE__ */ r("span", { className: x.loadingLabel, children: [
206
206
  /* @__PURE__ */ e("span", { "aria-hidden": "true", children: "$" }),
207
- a,
208
- /* @__PURE__ */ e("span", { "aria-hidden": "true", className: $.cursor })
209
- ] }) : o
207
+ t,
208
+ /* @__PURE__ */ e("span", { "aria-hidden": "true", className: x.cursor })
209
+ ] }) : s
210
210
  }
211
211
  );
212
212
  }
213
- const oe = "_panel_m16j3_1", ne = {
214
- panel: oe
213
+ const ae = "_panel_m16j3_1", ce = {
214
+ panel: ae
215
215
  };
216
- function qe({ children: t, dots: a = !1, className: o, ...n }) {
217
- const s = [ne.panel, a && "ds-dot-grid", o].filter(Boolean).join(" ");
218
- return /* @__PURE__ */ e("div", { className: s, ...n, children: t });
216
+ function He({ children: n, dots: t = !1, className: s, ...l }) {
217
+ const o = [ce.panel, t && "ds-dot-grid", s].filter(Boolean).join(" ");
218
+ return /* @__PURE__ */ e("div", { className: o, ...l, children: n });
219
219
  }
220
- const le = "_list_27va3_1", re = "_step_27va3_12", x = {
221
- list: le,
222
- step: re
220
+ const re = "_list_27va3_1", ie = "_step_27va3_12", S = {
221
+ list: re,
222
+ step: ie
223
223
  };
224
- function Se({ steps: t, className: a, ...o }) {
225
- const n = [x.list, a].filter(Boolean).join(" ");
226
- return /* @__PURE__ */ e("ul", { className: n, ...o, children: t.map((s) => /* @__PURE__ */ r("li", { className: x.step, children: [
227
- s.label,
224
+ function Je({ steps: n, className: t, ...s }) {
225
+ const l = [S.list, t].filter(Boolean).join(" ");
226
+ return /* @__PURE__ */ e("ul", { className: l, ...s, children: n.map((o) => /* @__PURE__ */ r("li", { className: S.step, children: [
227
+ o.label,
228
228
  " ",
229
- /* @__PURE__ */ e("b", { children: s.value })
230
- ] }, s.label)) });
229
+ /* @__PURE__ */ e("b", { children: o.value })
230
+ ] }, o.label)) });
231
231
  }
232
- const ce = "_quote_sjisa_1", ie = "_floatLeft_sjisa_13", de = "_floatRight_sjisa_14", ue = "_marker_sjisa_31", _e = "_text_sjisa_38", me = "_cursor_sjisa_46", p = {
233
- quote: ce,
234
- floatLeft: ie,
235
- floatRight: de,
236
- marker: ue,
237
- text: _e,
238
- cursor: me
232
+ const de = "_quote_sjisa_1", ue = "_floatLeft_sjisa_13", _e = "_floatRight_sjisa_14", be = "_marker_sjisa_31", me = "_text_sjisa_38", pe = "_cursor_sjisa_46", v = {
233
+ quote: de,
234
+ floatLeft: ue,
235
+ floatRight: _e,
236
+ marker: be,
237
+ text: me,
238
+ cursor: pe
239
239
  }, fe = {
240
240
  none: void 0,
241
- left: p.floatLeft,
242
- right: p.floatRight
241
+ left: v.floatLeft,
242
+ right: v.floatRight
243
243
  };
244
- function Ve({
245
- children: t,
246
- marker: a = "#",
247
- cursor: o = !0,
248
- float: n = "none",
249
- className: s,
250
- ...c
244
+ function We({
245
+ children: n,
246
+ marker: t = "#",
247
+ cursor: s = !0,
248
+ float: l = "none",
249
+ className: o,
250
+ ...i
251
251
  }) {
252
- const i = [p.quote, fe[n], s].filter(Boolean).join(" ");
253
- return /* @__PURE__ */ r("blockquote", { className: i, ...c, children: [
254
- /* @__PURE__ */ e("span", { className: p.marker, "aria-hidden": "true", children: a }),
255
- /* @__PURE__ */ r("p", { className: p.text, children: [
256
- t,
257
- o && /* @__PURE__ */ e("span", { className: p.cursor, "aria-hidden": "true" })
252
+ const a = [v.quote, fe[l], o].filter(Boolean).join(" ");
253
+ return /* @__PURE__ */ r("blockquote", { className: a, ...i, children: [
254
+ /* @__PURE__ */ e("span", { className: v.marker, "aria-hidden": "true", children: t }),
255
+ /* @__PURE__ */ r("p", { className: v.text, children: [
256
+ n,
257
+ s && /* @__PURE__ */ e("span", { className: v.cursor, "aria-hidden": "true" })
258
258
  ] })
259
259
  ] });
260
260
  }
261
- const be = "_grid_94gwu_1", ge = "_cell_94gwu_12", pe = "_value_94gwu_19", he = "_label_94gwu_28", k = {
262
- grid: be,
263
- cell: ge,
264
- value: pe,
265
- label: he
261
+ const he = "_backdrop_ihclc_1", ye = "_backdropVisible_ihclc_11", ge = "_panel_ihclc_16", ke = "_panelOpen_ihclc_35", ve = "_closeButton_ihclc_39", Ne = "_content_ihclc_60", k = {
262
+ backdrop: he,
263
+ backdropVisible: ye,
264
+ panel: ge,
265
+ panelOpen: ke,
266
+ closeButton: ve,
267
+ content: Ne
268
+ };
269
+ function Ye({
270
+ open: n,
271
+ onClose: t,
272
+ label: s,
273
+ children: l,
274
+ closeLabel: o = "Close",
275
+ className: i,
276
+ ...a
277
+ }) {
278
+ $(() => {
279
+ if (!n) return;
280
+ function u(h) {
281
+ h.key === "Escape" && t();
282
+ }
283
+ document.addEventListener("keydown", u);
284
+ const b = document.body.style.overflow;
285
+ return document.body.style.overflow = "hidden", () => {
286
+ document.removeEventListener("keydown", u), document.body.style.overflow = b;
287
+ };
288
+ }, [n, t]);
289
+ const d = [k.backdrop, n && k.backdropVisible].filter(Boolean).join(" "), _ = [k.panel, n && k.panelOpen, i].filter(Boolean).join(" ");
290
+ return /* @__PURE__ */ r(L, { children: [
291
+ /* @__PURE__ */ e("div", { className: d, "aria-hidden": "true", onClick: () => n && t() }),
292
+ /* @__PURE__ */ r(
293
+ "div",
294
+ {
295
+ className: _,
296
+ role: "dialog",
297
+ "aria-modal": "true",
298
+ "aria-label": s,
299
+ "aria-hidden": !n,
300
+ inert: !n,
301
+ ...a,
302
+ children: [
303
+ /* @__PURE__ */ e("button", { type: "button", className: k.closeButton, onClick: t, "aria-label": o, children: "×" }),
304
+ /* @__PURE__ */ e("div", { className: k.content, children: l })
305
+ ]
306
+ }
307
+ )
308
+ ] });
309
+ }
310
+ const we = "_grid_94gwu_1", $e = "_cell_94gwu_12", Be = "_value_94gwu_19", je = "_label_94gwu_28", N = {
311
+ grid: we,
312
+ cell: $e,
313
+ value: Be,
314
+ label: je
266
315
  };
267
- function Ae({ stats: t, className: a, ...o }) {
268
- const n = [k.grid, a].filter(Boolean).join(" ");
269
- return /* @__PURE__ */ e("dl", { className: n, ...o, children: t.map((s) => /* @__PURE__ */ r("div", { className: k.cell, children: [
270
- /* @__PURE__ */ e("dd", { className: k.value, children: s.value }),
271
- /* @__PURE__ */ e("dt", { className: k.label, children: s.label })
272
- ] }, s.label)) });
316
+ function en({ stats: n, className: t, ...s }) {
317
+ const l = [N.grid, t].filter(Boolean).join(" ");
318
+ return /* @__PURE__ */ e("dl", { className: l, ...s, children: n.map((o) => /* @__PURE__ */ r("div", { className: N.cell, children: [
319
+ /* @__PURE__ */ e("dd", { className: N.value, children: o.value }),
320
+ /* @__PURE__ */ e("dt", { className: N.label, children: o.label })
321
+ ] }, o.label)) });
273
322
  }
274
- const ye = "_list_17qxg_1", ke = "_tag_17qxg_10", L = {
275
- list: ye,
276
- tag: ke
323
+ const Ce = "_list_17qxg_1", Le = "_tag_17qxg_10", V = {
324
+ list: Ce,
325
+ tag: Le
277
326
  };
278
- function Te({ tags: t, className: a, ...o }) {
279
- const n = [L.list, a].filter(Boolean).join(" ");
280
- return /* @__PURE__ */ e("ul", { className: n, ...o, children: t.map((s) => /* @__PURE__ */ e("li", { className: L.tag, children: s }, s)) });
327
+ function nn({ tags: n, className: t, ...s }) {
328
+ const l = [V.list, t].filter(Boolean).join(" ");
329
+ return /* @__PURE__ */ e("ul", { className: l, ...s, children: n.map((o) => /* @__PURE__ */ e("li", { className: V.tag, children: o }, o)) });
281
330
  }
282
- const ve = "_prompt_vxkw7_1", Ne = "_path_vxkw7_11", we = "_cursor_vxkw7_15", j = {
283
- prompt: ve,
284
- path: Ne,
285
- cursor: we
331
+ const Ee = "_prompt_vxkw7_1", xe = "_path_vxkw7_11", Se = "_cursor_vxkw7_15", C = {
332
+ prompt: Ee,
333
+ path: xe,
334
+ cursor: Se
286
335
  };
287
- function De({ user: t, host: a, command: o, className: n, ...s }) {
288
- const c = [j.prompt, n].filter(Boolean).join(" ");
289
- return /* @__PURE__ */ r("p", { className: c, ...s, children: [
290
- /* @__PURE__ */ r("span", { className: j.path, children: [
291
- t,
336
+ function tn({ user: n, host: t, command: s, className: l, ...o }) {
337
+ const i = [C.prompt, l].filter(Boolean).join(" ");
338
+ return /* @__PURE__ */ r("p", { className: i, ...o, children: [
339
+ /* @__PURE__ */ r("span", { className: C.path, children: [
340
+ n,
292
341
  "@",
293
- a
342
+ t
294
343
  ] }),
295
344
  " ~$ ",
296
- o,
297
- /* @__PURE__ */ e("span", { className: j.cursor, "aria-hidden": "true" })
345
+ s,
346
+ /* @__PURE__ */ e("span", { className: C.cursor, "aria-hidden": "true" })
298
347
  ] });
299
348
  }
349
+ const Ve = "_list_nynky_1", Ae = "_row_nynky_10", De = "_line_nynky_19", Oe = "_button_nynky_29", qe = "_node_nynky_42", Te = "_nodeSelected_nynky_64", Fe = "_icon_nynky_68", Ie = "_fallback_nynky_74", Ke = "_label_nynky_81", p = {
350
+ list: Ve,
351
+ row: Ae,
352
+ line: De,
353
+ button: Oe,
354
+ node: qe,
355
+ nodeSelected: Te,
356
+ icon: Fe,
357
+ fallback: Ie,
358
+ label: Ke
359
+ }, Re = 137.508;
360
+ function Pe(n) {
361
+ return `hsl(${Math.round(n * Re % 360)}deg 70% 60%)`;
362
+ }
363
+ function on({ items: n, selectedId: t, onSelect: s, className: l, ...o }) {
364
+ const i = [p.list, l].filter(Boolean).join(" ");
365
+ return /* @__PURE__ */ e("ol", { className: i, ...o, children: n.map((a, d) => {
366
+ const _ = Pe(d), u = a.id === t, b = [p.node, u && p.nodeSelected].filter(Boolean).join(" ");
367
+ return /* @__PURE__ */ r(
368
+ "li",
369
+ {
370
+ className: p.row,
371
+ style: { "--timeline-color": _ },
372
+ children: [
373
+ /* @__PURE__ */ r(
374
+ "button",
375
+ {
376
+ type: "button",
377
+ className: p.button,
378
+ onClick: () => s?.(a.id),
379
+ "aria-pressed": u,
380
+ children: [
381
+ /* @__PURE__ */ e("span", { className: b, children: a.iconUrl ? /* @__PURE__ */ e("img", { src: a.iconUrl, alt: "", className: p.icon, loading: "lazy" }) : /* @__PURE__ */ e("span", { className: p.fallback, "aria-hidden": "true", children: a.label.charAt(0).toUpperCase() }) }),
382
+ /* @__PURE__ */ e("span", { className: p.label, children: a.label })
383
+ ]
384
+ }
385
+ ),
386
+ d < n.length - 1 && /* @__PURE__ */ e("span", { className: p.line, "aria-hidden": "true" })
387
+ ]
388
+ },
389
+ a.id
390
+ );
391
+ }) });
392
+ }
300
393
  export {
301
- Ce as Avatar,
302
- $e as Button,
303
- xe as CommandPalette,
304
- Le as Eyebrow,
305
- Ee as LoadingButton,
306
- qe as Panel,
307
- Se as PipelineBadges,
308
- Ve as Quote,
309
- Ae as StatGrid,
310
- Te as TagList,
311
- De as TerminalPrompt
394
+ Qe as Avatar,
395
+ Ze as Button,
396
+ Me as CommandPalette,
397
+ Xe as Eyebrow,
398
+ ze as LoadingButton,
399
+ He as Panel,
400
+ Je as PipelineBadges,
401
+ We as Quote,
402
+ Ye as SidePanel,
403
+ en as StatGrid,
404
+ nn as TagList,
405
+ tn as TerminalPrompt,
406
+ on as Timeline
312
407
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@alishenriques/design-system",
3
- "version": "0.5.0",
3
+ "version": "0.6.0",
4
4
  "description": "Isolated design system for Alis portfolio and future products",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",