@alishenriques/design-system 0.4.3 → 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
 
@@ -1,10 +1,18 @@
1
1
  import { BlockquoteHTMLAttributes, ReactNode } from 'react';
2
+ export type QuoteFloat = "none" | "left" | "right";
2
3
  export type QuoteProps = {
3
4
  children: ReactNode;
4
5
  /** Small comment-style marker before the text. Default: "#". */
5
6
  marker?: string;
6
7
  /** Shows a blinking block cursor after the text. Default: true. */
7
8
  cursor?: boolean;
9
+ /**
10
+ * Pulls the quote to a side, magazine-style, with surrounding text
11
+ * wrapping around it — only from the sm breakpoint up (640px); below that
12
+ * it always stacks in normal flow, since a floated quote has no room to
13
+ * breathe on a narrow screen. Default: "none" (stays inline, full width).
14
+ */
15
+ float?: QuoteFloat;
8
16
  } & Omit<BlockquoteHTMLAttributes<HTMLQuoteElement>, "children">;
9
17
  /**
10
18
  * A terminal-styled pull-quote: an accent left border, a comment-style marker
@@ -13,4 +21,4 @@ export type QuoteProps = {
13
21
  * calling out a key sentence from a longer piece of copy (a bio, an article)
14
22
  * as its own visual beat, semantically a `<blockquote>`.
15
23
  */
16
- export declare function Quote({ children, marker, cursor, className, ...props }: QuoteProps): import("react").JSX.Element;
24
+ export declare function Quote({ children, marker, cursor, float, className, ...props }: QuoteProps): import("react").JSX.Element;
@@ -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_1og2n_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)}._marker_1og2n_12{flex-shrink:0;font-family:var(--ds-font-mono);font-weight:600;color:var(--ds-color-accent)}._text_1og2n_19{margin:0;font-family:var(--ds-font-mono);font-size:15px;line-height:1.6;color:var(--ds-color-fg)}._cursor_1og2n_27{display:inline-block;width:8px;height:15px;margin-left:4px;vertical-align:text-bottom;background:var(--ds-color-accent);animation:_blink_1og2n_1 1s step-end infinite}@media(prefers-reduced-motion:reduce){._cursor_1og2n_27{animation:none}}@keyframes _blink_1og2n_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
2
  import { jsxs as r, Fragment as L, jsx as e } from "react/jsx-runtime";
3
- import { useState as v, useEffect as $, useRef as D } from "react";
4
- const T = "_trigger_e3bgf_1", A = "_image_e3bgf_19", I = "_backdrop_e3bgf_26", S = "_backdropVisible_e3bgf_48", F = "_frame_e3bgf_55", K = "_frameVisible_e3bgf_61", P = "_circle_e3bgf_53", O = "_expandedImage_e3bgf_80", Q = "_closeButton_e3bgf_87", d = {
5
- trigger: T,
6
- image: A,
7
- backdrop: I,
8
- backdropVisible: S,
9
- frame: F,
10
- frameVisible: K,
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
+ image: T,
7
+ backdrop: F,
8
+ backdropVisible: I,
9
+ frame: K,
10
+ frameVisible: R,
11
11
  circle: P,
12
- expandedImage: O,
13
- closeButton: Q
14
- }, R = 96, U = "min(70vw, 60vh, 440px)";
15
- function we({
16
- src: t,
17
- alt: o,
18
- size: a = R,
19
- expandedSize: n = U,
20
- objectPosition: s = "center",
21
- closeLabel: c = "Close",
22
- className: m,
23
- ...i
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
+ ...d
24
24
  }) {
25
- const [u, b] = v(!1), [f, h] = v(!1);
25
+ const [_, u] = w(!1), [b, h] = w(!1);
26
26
  $(() => {
27
- if (!u) return;
28
- function g(V) {
29
- V.key === "Escape" && b(!1);
27
+ if (!_) return;
28
+ function y(D) {
29
+ D.key === "Escape" && u(!1);
30
30
  }
31
- document.addEventListener("keydown", g);
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(() => h(!0));
34
+ const A = requestAnimationFrame(() => h(!0));
35
35
  return () => {
36
- document.removeEventListener("keydown", g), document.body.style.overflow = w, cancelAnimationFrame(q), h(!1);
36
+ document.removeEventListener("keydown", y), document.body.style.overflow = j, cancelAnimationFrame(A), h(!1);
37
37
  };
38
- }, [u]);
39
- const N = [d.trigger, m].filter(Boolean).join(" "), l = [d.frame, f && d.frameVisible].filter(Boolean).join(" "), _ = [d.backdrop, f && d.backdropVisible].filter(Boolean).join(" ");
38
+ }, [_]);
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
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: a, height: a },
47
- onClick: () => b(!0),
45
+ className: B,
46
+ style: { width: s, height: s },
47
+ onClick: () => u(!0),
48
48
  "aria-haspopup": "dialog",
49
- ...i,
49
+ ...d,
50
50
  children: /* @__PURE__ */ e(
51
51
  "img",
52
52
  {
53
- src: t,
54
- alt: o,
55
- className: d.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
- u && /* @__PURE__ */ e("div", { className: _, onClick: (g) => g.target === g.currentTarget && b(!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": o,
69
+ "aria-label": t,
70
70
  children: [
71
- /* @__PURE__ */ e("div", { className: d.circle, children: /* @__PURE__ */ e(
71
+ /* @__PURE__ */ e("div", { className: m.circle, children: /* @__PURE__ */ e(
72
72
  "img",
73
73
  {
74
- src: t,
75
- alt: o,
76
- className: d.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: d.closeButton,
85
- onClick: () => b(!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,208 +92,316 @@ function we({
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 Be({
101
- children: t,
102
- variant: o = "primary",
103
- type: a = "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[o], n].filter(Boolean).join(" ");
108
- return /* @__PURE__ */ e("button", { type: a, className: c, "data-variant": o, ...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", p = {
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 $e({
119
- items: t,
120
- triggerLabel: o = "Search",
121
- placeholder: a = "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 [m, i] = v(!1), [u, b] = v(""), f = D(null);
126
+ const [a, d] = w(!1), [_, u] = w(""), b = O(null);
127
127
  $(() => {
128
- m && f.current?.focus();
129
- }, [m]), $(() => {
130
- function l(_) {
131
- if ((_.metaKey || _.ctrlKey) && _.key.toLowerCase() === "k") {
132
- _.preventDefault(), i((w) => !w);
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
- _.key === "Escape" && i(!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 h = t.filter((l) => `${l.label} ${l.hint ?? ""}`.toLowerCase().includes(u.trim().toLowerCase())), N = [p.trigger, s].filter(Boolean).join(" ");
139
+ const h = n.filter((c) => `${c.label} ${c.hint ?? ""}`.toLowerCase().includes(_.trim().toLowerCase())), B = [g.trigger, o].filter(Boolean).join(" ");
140
140
  return /* @__PURE__ */ r(L, { children: [
141
- /* @__PURE__ */ r("button", { type: "button", className: N, onClick: () => i(!0), ...c, children: [
142
- /* @__PURE__ */ e("span", { children: o }),
143
- /* @__PURE__ */ e("kbd", { className: p.kbd, children: "⌘K" })
141
+ /* @__PURE__ */ r("button", { type: "button", className: B, onClick: () => d(!0), ...i, children: [
142
+ /* @__PURE__ */ e("span", { children: t }),
143
+ /* @__PURE__ */ e("kbd", { className: g.kbd, children: "⌘K" })
144
144
  ] }),
145
- m && /* @__PURE__ */ e("div", { className: p.backdrop, onClick: (l) => l.target === l.currentTarget && i(!1), children: /* @__PURE__ */ r("div", { className: p.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: f,
149
+ ref: b,
150
150
  type: "text",
151
- className: p.input,
152
- placeholder: a,
153
- value: u,
154
- onChange: (l) => b(l.target.value),
151
+ className: g.input,
152
+ placeholder: s,
153
+ value: _,
154
+ onChange: (c) => u(c.target.value),
155
155
  autoComplete: "off"
156
156
  }
157
157
  ),
158
- /* @__PURE__ */ e("ul", { className: p.list, children: h.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: () => i(!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 Ce({ children: t, className: o, ...a }) {
173
- const n = [te.eyebrow, o].filter(Boolean).join(" ");
174
- return /* @__PURE__ */ e("p", { className: n, ...a, 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", oe = "_cursor_1yug9_10", j = {
176
+ const se = "_loadingLabel_1yug9_1", le = "_cursor_1yug9_10", x = {
177
177
  loadingLabel: se,
178
- cursor: oe
178
+ cursor: le
179
179
  };
180
- function je({
181
- isLoading: t,
182
- loadingText: o,
183
- children: a,
184
- className: n,
185
- style: s,
186
- disabled: c,
187
- type: m = "button",
188
- ...i
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
+ ...d
189
189
  }) {
190
- const u = [n].filter(Boolean).join(" ");
190
+ const _ = [l].filter(Boolean).join(" ");
191
191
  return /* @__PURE__ */ e(
192
192
  "button",
193
193
  {
194
- type: m,
195
- className: u,
196
- style: { ...s, ...t ? {
194
+ type: a,
195
+ className: _,
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,
204
- ...i,
205
- children: t ? /* @__PURE__ */ r("span", { className: j.loadingLabel, children: [
202
+ disabled: !!i || n,
203
+ "aria-busy": n || void 0,
204
+ ...d,
205
+ children: n ? /* @__PURE__ */ r("span", { className: x.loadingLabel, children: [
206
206
  /* @__PURE__ */ e("span", { "aria-hidden": "true", children: "$" }),
207
- o,
208
- /* @__PURE__ */ e("span", { "aria-hidden": "true", className: j.cursor })
209
- ] }) : a
207
+ t,
208
+ /* @__PURE__ */ e("span", { "aria-hidden": "true", className: x.cursor })
209
+ ] }) : s
210
210
  }
211
211
  );
212
212
  }
213
- const ae = "_panel_m16j3_1", ne = {
213
+ const ae = "_panel_m16j3_1", ce = {
214
214
  panel: ae
215
215
  };
216
- function xe({ children: t, dots: o = !1, className: a, ...n }) {
217
- const s = [ne.panel, o && "ds-dot-grid", a].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 Ee({ steps: t, className: o, ...a }) {
225
- const n = [x.list, o].filter(Boolean).join(" ");
226
- return /* @__PURE__ */ e("ul", { className: n, ...a, 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_1og2n_1", ie = "_marker_1og2n_12", de = "_text_1og2n_19", ue = "_cursor_1og2n_27", y = {
233
- quote: ce,
234
- marker: ie,
235
- text: de,
236
- cursor: ue
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
+ }, fe = {
240
+ none: void 0,
241
+ left: v.floatLeft,
242
+ right: v.floatRight
237
243
  };
238
- function Le({ children: t, marker: o = "#", cursor: a = !0, className: n, ...s }) {
239
- const c = [y.quote, n].filter(Boolean).join(" ");
240
- return /* @__PURE__ */ r("blockquote", { className: c, ...s, children: [
241
- /* @__PURE__ */ e("span", { className: y.marker, "aria-hidden": "true", children: o }),
242
- /* @__PURE__ */ r("p", { className: y.text, children: [
243
- t,
244
- a && /* @__PURE__ */ e("span", { className: y.cursor, "aria-hidden": "true" })
244
+ function We({
245
+ children: n,
246
+ marker: t = "#",
247
+ cursor: s = !0,
248
+ float: l = "none",
249
+ className: o,
250
+ ...i
251
+ }) {
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" })
245
258
  ] })
246
259
  ] });
247
260
  }
248
- const _e = "_grid_94gwu_1", me = "_cell_94gwu_12", be = "_value_94gwu_19", ge = "_label_94gwu_28", k = {
249
- grid: _e,
250
- cell: me,
251
- value: be,
252
- label: ge
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
253
268
  };
254
- function qe({ stats: t, className: o, ...a }) {
255
- const n = [k.grid, o].filter(Boolean).join(" ");
256
- return /* @__PURE__ */ e("dl", { className: n, ...a, children: t.map((s) => /* @__PURE__ */ r("div", { className: k.cell, children: [
257
- /* @__PURE__ */ e("dd", { className: k.value, children: s.value }),
258
- /* @__PURE__ */ e("dt", { className: k.label, children: s.label })
259
- ] }, s.label)) });
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
+ ] });
260
309
  }
261
- const pe = "_list_17qxg_1", fe = "_tag_17qxg_10", E = {
262
- list: pe,
263
- tag: fe
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
264
315
  };
265
- function Ve({ tags: t, className: o, ...a }) {
266
- const n = [E.list, o].filter(Boolean).join(" ");
267
- return /* @__PURE__ */ e("ul", { className: n, ...a, children: t.map((s) => /* @__PURE__ */ e("li", { className: E.tag, children: s }, s)) });
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)) });
268
322
  }
269
- const he = "_prompt_vxkw7_1", ye = "_path_vxkw7_11", ke = "_cursor_vxkw7_15", B = {
270
- prompt: he,
271
- path: ye,
272
- cursor: ke
323
+ const Ce = "_list_17qxg_1", Le = "_tag_17qxg_10", V = {
324
+ list: Ce,
325
+ tag: Le
273
326
  };
274
- function De({ user: t, host: o, command: a, className: n, ...s }) {
275
- const c = [B.prompt, n].filter(Boolean).join(" ");
276
- return /* @__PURE__ */ r("p", { className: c, ...s, children: [
277
- /* @__PURE__ */ r("span", { className: B.path, children: [
278
- t,
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)) });
330
+ }
331
+ const Ee = "_prompt_vxkw7_1", xe = "_path_vxkw7_11", Se = "_cursor_vxkw7_15", C = {
332
+ prompt: Ee,
333
+ path: xe,
334
+ cursor: Se
335
+ };
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,
279
341
  "@",
280
- o
342
+ t
281
343
  ] }),
282
344
  " ~$ ",
283
- a,
284
- /* @__PURE__ */ e("span", { className: B.cursor, "aria-hidden": "true" })
345
+ s,
346
+ /* @__PURE__ */ e("span", { className: C.cursor, "aria-hidden": "true" })
285
347
  ] });
286
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
+ }
287
393
  export {
288
- we as Avatar,
289
- Be as Button,
290
- $e as CommandPalette,
291
- Ce as Eyebrow,
292
- je as LoadingButton,
293
- xe as Panel,
294
- Ee as PipelineBadges,
295
- Le as Quote,
296
- qe as StatGrid,
297
- Ve as TagList,
298
- 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
299
407
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@alishenriques/design-system",
3
- "version": "0.4.3",
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",