@goliapkg/gds 1.7.0 → 2.0.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/dist/{gesture-irjS0hVM.js → gesture-I79dlTuS.js} +1 -1
- package/dist/{gesture-irjS0hVM.js.map → gesture-I79dlTuS.js.map} +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +26 -26
- package/dist/l0-tokens/index.js +1 -1
- package/dist/l0-tokens/motion-system.d.ts +1 -0
- package/dist/l0-tokens/motion-system.d.ts.map +1 -1
- package/dist/l0-tokens/shadow-system.d.ts.map +1 -1
- package/dist/l1-systems/index.d.ts +2 -2
- package/dist/l1-systems/index.d.ts.map +1 -1
- package/dist/l1-systems/index.js +9 -9
- package/dist/l1-systems/theme.d.ts +28 -0
- package/dist/l1-systems/theme.d.ts.map +1 -1
- package/dist/l2-primitives/focus-ring.d.ts +9 -3
- package/dist/l2-primitives/focus-ring.d.ts.map +1 -1
- package/dist/l2-primitives/glow-effect.d.ts +8 -2
- package/dist/l2-primitives/glow-effect.d.ts.map +1 -1
- package/dist/l2-primitives/gradient-border.d.ts +8 -2
- package/dist/l2-primitives/gradient-border.d.ts.map +1 -1
- package/dist/l2-primitives/index.js +2 -2
- package/dist/l2-primitives/input.d.ts +16 -0
- package/dist/l2-primitives/input.d.ts.map +1 -1
- package/dist/l2-primitives/loading.d.ts +21 -6
- package/dist/l2-primitives/loading.d.ts.map +1 -1
- package/dist/l2-primitives/truncate.d.ts +8 -2
- package/dist/l2-primitives/truncate.d.ts.map +1 -1
- package/dist/{l2-primitives-Le0006ck.js → l2-primitives-DdQHMJRE.js} +57 -40
- package/dist/l2-primitives-DdQHMJRE.js.map +1 -0
- package/dist/l3-atoms/index.js +6 -6
- package/dist/{l3-atoms-Cvu01YHO.js → l3-atoms-BGwlQvjl.js} +150 -187
- package/dist/l3-atoms-BGwlQvjl.js.map +1 -0
- package/dist/l4-molecules/accordion.d.ts.map +1 -1
- package/dist/l4-molecules/combobox-list.d.ts +4 -1
- package/dist/l4-molecules/combobox-list.d.ts.map +1 -1
- package/dist/l4-molecules/combobox.d.ts +5 -0
- package/dist/l4-molecules/combobox.d.ts.map +1 -1
- package/dist/l4-molecules/email-composer-field.d.ts +38 -0
- package/dist/l4-molecules/email-composer-field.d.ts.map +1 -0
- package/dist/l4-molecules/index.d.ts +6 -0
- package/dist/l4-molecules/index.d.ts.map +1 -1
- package/dist/l4-molecules/index.js +4 -4
- package/dist/l4-molecules/tab-group.d.ts +5 -1
- package/dist/l4-molecules/tab-group.d.ts.map +1 -1
- package/dist/l4-molecules/tabs.d.ts +4 -1
- package/dist/l4-molecules/tabs.d.ts.map +1 -1
- package/dist/l4-molecules/toast-provider.d.ts +10 -0
- package/dist/l4-molecules/toast-provider.d.ts.map +1 -0
- package/dist/l4-molecules/toast-store.d.ts +42 -0
- package/dist/l4-molecules/toast-store.d.ts.map +1 -0
- package/dist/{l4-molecules-CSmApFmt.js → l4-molecules-HRbUopGS.js} +1391 -1206
- package/dist/l4-molecules-HRbUopGS.js.map +1 -0
- package/dist/l5-organisms/command-palette-list.d.ts +3 -1
- package/dist/l5-organisms/command-palette-list.d.ts.map +1 -1
- package/dist/l5-organisms/command-palette.d.ts +10 -1
- package/dist/l5-organisms/command-palette.d.ts.map +1 -1
- package/dist/l5-organisms/email-composer.d.ts +118 -0
- package/dist/l5-organisms/email-composer.d.ts.map +1 -0
- package/dist/l5-organisms/email-thread.d.ts +85 -0
- package/dist/l5-organisms/email-thread.d.ts.map +1 -0
- package/dist/l5-organisms/index.d.ts +6 -0
- package/dist/l5-organisms/index.d.ts.map +1 -1
- package/dist/l5-organisms/index.js +2 -2
- package/dist/l5-organisms/markdown-preview.d.ts +6 -0
- package/dist/l5-organisms/markdown-preview.d.ts.map +1 -1
- package/dist/l5-organisms/rich-text-editor.d.ts +56 -0
- package/dist/l5-organisms/rich-text-editor.d.ts.map +1 -0
- package/dist/{l5-organisms-Css3AvsZ.js → l5-organisms-BA62NsFK.js} +2435 -1247
- package/dist/l5-organisms-BA62NsFK.js.map +1 -0
- package/dist/l6-charts/index.js +1 -1
- package/dist/{l6-charts-DPMj1m0E.js → l6-charts-DzRRfX8J.js} +1 -1
- package/dist/{l6-charts-DPMj1m0E.js.map → l6-charts-DzRRfX8J.js.map} +1 -1
- package/dist/l7-patterns/admin-layout.d.ts +6 -0
- package/dist/l7-patterns/admin-layout.d.ts.map +1 -1
- package/dist/l7-patterns/app-shell.d.ts +44 -0
- package/dist/l7-patterns/app-shell.d.ts.map +1 -0
- package/dist/l7-patterns/inbox-layout.d.ts +50 -3
- package/dist/l7-patterns/inbox-layout.d.ts.map +1 -1
- package/dist/l7-patterns/index.d.ts +6 -2
- package/dist/l7-patterns/index.d.ts.map +1 -1
- package/dist/l7-patterns/index.js +2 -2
- package/dist/l7-patterns/panel-group.d.ts +42 -0
- package/dist/l7-patterns/panel-group.d.ts.map +1 -0
- package/dist/l7-patterns/settings-layout.d.ts +6 -1
- package/dist/l7-patterns/settings-layout.d.ts.map +1 -1
- package/dist/l7-patterns/sidebar.d.ts +14 -0
- package/dist/l7-patterns/sidebar.d.ts.map +1 -1
- package/dist/{l7-patterns-8fc4b3eE.js → l7-patterns-Dn7X2pQC.js} +847 -544
- package/dist/l7-patterns-Dn7X2pQC.js.map +1 -0
- package/dist/loading-dots-Dz79qOGY.js +62 -0
- package/dist/loading-dots-Dz79qOGY.js.map +1 -0
- package/dist/sanitize-BF45M9xp.js +33 -0
- package/dist/sanitize-BF45M9xp.js.map +1 -0
- package/dist/{scales-B23Guac-.js → scales-DlVrSOA2.js} +98 -96
- package/dist/scales-DlVrSOA2.js.map +1 -0
- package/dist/spinner-DyrwL4JQ.js +201 -0
- package/dist/spinner-DyrwL4JQ.js.map +1 -0
- package/dist/stepper-DKJuH1ws.js +199 -0
- package/dist/stepper-DKJuH1ws.js.map +1 -0
- package/dist/toast-DTuqMdrj.js +614 -0
- package/dist/toast-DTuqMdrj.js.map +1 -0
- package/dist/tokens.css +5 -0
- package/dist/{use-theme-CONuDdW3.js → use-theme-BI1t0nvJ.js} +59 -34
- package/dist/use-theme-BI1t0nvJ.js.map +1 -0
- package/dist/utils/index.d.ts +2 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +3 -2
- package/dist/utils/sanitize.d.ts +7 -0
- package/dist/utils/sanitize.d.ts.map +1 -0
- package/dist/utils/tiptap.d.ts +12 -0
- package/dist/utils/tiptap.d.ts.map +1 -0
- package/package.json +42 -3
- package/dist/l2-primitives-Le0006ck.js.map +0 -1
- package/dist/l3-atoms-Cvu01YHO.js.map +0 -1
- package/dist/l4-molecules-CSmApFmt.js.map +0 -1
- package/dist/l5-organisms-Css3AvsZ.js.map +0 -1
- package/dist/l7-patterns-8fc4b3eE.js.map +0 -1
- package/dist/loading-dots-fB4X_Zh0.js +0 -24
- package/dist/loading-dots-fB4X_Zh0.js.map +0 -1
- package/dist/scales-B23Guac-.js.map +0 -1
- package/dist/spinner-N7UNjdsQ.js +0 -144
- package/dist/spinner-N7UNjdsQ.js.map +0 -1
- package/dist/stepper-DWJfv7TA.js +0 -140
- package/dist/stepper-DWJfv7TA.js.map +0 -1
- package/dist/toast-DN5xANLM.js +0 -442
- package/dist/toast-DN5xANLM.js.map +0 -1
- package/dist/use-theme-CONuDdW3.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toast-DTuqMdrj.js","names":[],"sources":["../src/l4-molecules/audit-entry.tsx","../src/l4-molecules/email-composer-field.tsx","../src/l4-molecules/inline-edit.tsx","../src/l4-molecules/list-item.tsx","../src/l4-molecules/notification.tsx","../src/l4-molecules/task-item.tsx","../src/l4-molecules/toast.tsx"],"sourcesContent":["import { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype AuditEntryVariant = 'danger' | 'default' | 'success' | 'warning'\n\ntype AuditEntryProps = React.HTMLAttributes<HTMLDivElement> & {\n action: string\n target?: string\n timestamp: string\n user: string\n variant?: AuditEntryVariant\n}\n\nconst variantCls: Record<AuditEntryVariant, string> = {\n default: 'text-fg',\n success: 'text-success',\n warning: 'text-warning',\n danger: 'text-danger',\n}\n\nexport const AuditEntry = forwardRef<HTMLDivElement, AuditEntryProps>(\n function AuditEntry({ action, className, target, timestamp, user, variant = 'default', ...props }, ref) {\n return (\n <div\n className={cx('flex items-center justify-between gds-gap gds-text', className)}\n data-component=\"audit-entry\"\n ref={ref}\n {...props}\n >\n <span className=\"shrink-0 text-xs text-fg-muted\">{timestamp}</span>\n <span className=\"flex-1 truncate\">\n <span className=\"font-medium text-fg\">{user}</span>\n {' '}\n <span className={variantCls[variant]}>{action}</span>\n {target !== undefined && <span className=\"text-fg-muted\"> {target}</span>}\n </span>\n </div>\n )\n },\n)\n\nexport type { AuditEntryProps, AuditEntryVariant }\n","// email-composer-field — recipient input with contact chips and autocomplete\n// used by EmailComposer for To/Cc/Bcc fields\n// based on TagInput + Combobox patterns\n\nimport { forwardRef, useCallback, useEffect, useRef, useState } from 'react'\n\nimport { cx } from '../utils/cx'\nimport { glassClass } from '../utils/glass'\n\n// ---- types ----\n\nexport type EmailContact = {\n email: string\n name?: string\n avatar?: string\n}\n\nexport type EmailComposerFieldProps = Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange'> & {\n /** current recipient list */\n value: EmailContact[]\n /** update recipient list */\n onChange: (contacts: EmailContact[]) => void\n\n /** async search for contacts */\n onSearch: (query: string) => Promise<EmailContact[]>\n /** static suggestion list */\n suggestions?: EmailContact[]\n\n /** field label: \"To\", \"Cc\", \"Bcc\" */\n label: string\n placeholder?: string\n\n /** frosted glass effect */\n glass?: boolean\n className?: string\n}\n\n// simple email validation (RFC 5322 basic)\nfunction isValidEmail(email: string): boolean {\n return /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(email)\n}\n\n// generate initials color from email (same algorithm as Avatar)\nfunction emailColor(email: string): string {\n let hash = 0\n for (let i = 0; i < email.length; i++) {\n hash = email.charCodeAt(i) + ((hash << 5) - hash)\n }\n const colors = [\n 'bg-palette-0/20 text-palette-0',\n 'bg-palette-1/20 text-palette-1',\n 'bg-palette-2/20 text-palette-2',\n 'bg-palette-3/20 text-palette-3',\n 'bg-palette-4/20 text-palette-4',\n 'bg-palette-5/20 text-palette-5',\n 'bg-palette-6/20 text-palette-6',\n 'bg-palette-7/20 text-palette-7',\n ]\n return colors[Math.abs(hash) % colors.length]\n}\n\n// ---- chip ----\n\nfunction ContactChip({\n contact,\n onRemove,\n}: {\n contact: EmailContact\n onRemove: () => void\n}) {\n const displayName = contact.name ?? contact.email\n return (\n <span\n className={cx(\n 'inline-flex items-center gap-1 rounded-full px-2 py-0.5 gds-text-label select-none',\n emailColor(contact.email),\n )}\n data-component=\"contact-chip\"\n >\n <span className=\"truncate max-w-[160px]\">{displayName}</span>\n <button\n type=\"button\"\n className=\"shrink-0 rounded-full p-0.5 hover:bg-white/10 transition-colors\"\n onClick={onRemove}\n aria-label={`Remove ${displayName}`}\n tabIndex={-1}\n >\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\">\n <path d=\"M2 2l6 6M8 2l-6 6\" />\n </svg>\n </button>\n </span>\n )\n}\n\n// ---- dropdown ----\n\nfunction SuggestionDropdown({\n results,\n activeIndex,\n onSelect,\n}: {\n results: EmailContact[]\n activeIndex: number\n onSelect: (contact: EmailContact) => void\n}) {\n if (results.length === 0) return null\n\n return (\n <div className=\"absolute left-0 right-0 top-full mt-1 z-50 rounded-lg border border-border bg-bg-secondary shadow-lg overflow-hidden max-h-48 overflow-y-auto\" role=\"listbox\" id=\"email-composer-suggestions\">\n {results.map((contact, i) => (\n <button\n key={contact.email}\n type=\"button\"\n className={cx(\n 'flex w-full items-center gap-2 px-3 py-2 text-left gds-text-body transition-colors',\n i === activeIndex ? 'bg-accent/10 text-accent' : 'text-fg hover:bg-white/[0.04]',\n )}\n onClick={() => onSelect(contact)}\n data-active={i === activeIndex}\n role=\"option\"\n aria-selected={i === activeIndex}\n >\n <span className={cx('flex h-6 w-6 shrink-0 items-center justify-center rounded-full gds-text-caption font-medium', emailColor(contact.email))}>\n {(contact.name ?? contact.email).charAt(0).toUpperCase()}\n </span>\n <div className=\"min-w-0 flex-1\">\n {contact.name !== undefined && (\n <div className=\"truncate text-fg\">{contact.name}</div>\n )}\n <div className=\"truncate text-fg-muted gds-text-label\">{contact.email}</div>\n </div>\n </button>\n ))}\n </div>\n )\n}\n\n// ---- main component ----\n\nexport const EmailComposerField = forwardRef<HTMLDivElement, EmailComposerFieldProps>(\n function EmailComposerField({\n value,\n onChange,\n onSearch,\n suggestions,\n label,\n placeholder,\n glass,\n className,\n ...props\n }, ref) {\n const [query, setQuery] = useState('')\n const [results, setResults] = useState<EmailContact[]>([])\n const [activeIndex, setActiveIndex] = useState(0)\n const [showDropdown, setShowDropdown] = useState(false)\n const inputRef = useRef<HTMLInputElement>(null)\n const debounceRef = useRef<ReturnType<typeof setTimeout>>(undefined)\n const searchSeqRef = useRef(0)\n const blurTimerRef = useRef<ReturnType<typeof setTimeout>>(undefined)\n\n // cleanup blur timer on unmount\n useEffect(() => {\n return () => {\n if (blurTimerRef.current !== undefined) {\n clearTimeout(blurTimerRef.current)\n }\n }\n }, [])\n\n // async search with debounce\n useEffect(() => {\n if (query.length < 1) {\n setResults(suggestions ?? [])\n return\n }\n\n if (debounceRef.current !== undefined) {\n clearTimeout(debounceRef.current)\n }\n\n const seq = ++searchSeqRef.current\n\n debounceRef.current = setTimeout(async () => {\n const searchResults = await onSearch(query)\n // discard stale responses from out-of-order async completions\n if (seq !== searchSeqRef.current) return\n // filter out already-selected contacts\n const filtered = searchResults.filter(\n r => !value.some(v => v.email === r.email),\n )\n setResults(filtered)\n setActiveIndex(0)\n }, 200)\n\n return () => {\n if (debounceRef.current !== undefined) {\n clearTimeout(debounceRef.current)\n }\n }\n }, [query, onSearch, suggestions, value])\n\n const addContact = useCallback((contact: EmailContact) => {\n if (value.some(v => v.email === contact.email)) return\n onChange([...value, contact])\n setQuery('')\n setResults([])\n setShowDropdown(false)\n inputRef.current?.focus()\n }, [value, onChange])\n\n const addEmailFromText = useCallback((text: string) => {\n const trimmed = text.trim()\n if (trimmed === '') return\n // handle paste with commas\n const emails = trimmed.split(/[,;\\n]+/).map(e => e.trim()).filter(e => e !== '')\n const newContacts: EmailContact[] = []\n for (const email of emails) {\n if (isValidEmail(email) && !value.some(v => v.email === email)) {\n newContacts.push({ email })\n }\n }\n if (newContacts.length > 0) {\n onChange([...value, ...newContacts])\n setQuery('')\n }\n }, [value, onChange])\n\n const removeContact = useCallback((index: number) => {\n const next = [...value]\n next.splice(index, 1)\n onChange(next)\n }, [value, onChange])\n\n const handleKeyDown = useCallback((e: React.KeyboardEvent) => {\n if (e.key === 'ArrowDown' && showDropdown) {\n e.preventDefault()\n setActiveIndex(prev => (prev + 1) % Math.max(results.length, 1))\n } else if (e.key === 'ArrowUp' && showDropdown) {\n e.preventDefault()\n setActiveIndex(prev => (prev - 1 + results.length) % Math.max(results.length, 1))\n } else if (e.key === 'Enter' && showDropdown && results[activeIndex] !== undefined) {\n e.preventDefault()\n addContact(results[activeIndex])\n } else if (e.key === 'Enter' || e.key === 'Tab' || e.key === ',') {\n if (query.trim() !== '') {\n e.preventDefault()\n addEmailFromText(query)\n }\n } else if (e.key === 'Backspace' && query === '' && value.length > 0) {\n removeContact(value.length - 1)\n }\n }, [showDropdown, results, activeIndex, query, value, addContact, addEmailFromText, removeContact])\n\n const handlePaste = useCallback((e: React.ClipboardEvent) => {\n const text = e.clipboardData.getData('text')\n if (text.includes(',') || text.includes(';') || text.includes('\\n')) {\n e.preventDefault()\n addEmailFromText(text)\n }\n }, [addEmailFromText])\n\n return (\n <div\n {...props}\n ref={ref}\n className={cx('relative', className)}\n data-component=\"email-composer-field\"\n >\n <div\n className={cx(\n 'flex flex-wrap items-center gap-1 min-h-[36px] px-2 py-1 border border-border gds-radius-input bg-bg transition-colors',\n 'focus-within:ring-2 focus-within:ring-accent/30',\n glass === true && glassClass(glass),\n glass === true && 'border-white/10 bg-bg/60',\n )}\n onClick={() => inputRef.current?.focus()}\n >\n <span className=\"shrink-0 gds-text-label text-fg-muted select-none w-6\">{label}</span>\n\n {value.map((contact, i) => (\n <ContactChip\n key={contact.email}\n contact={contact}\n onRemove={() => removeContact(i)}\n />\n ))}\n\n <input\n ref={inputRef}\n type=\"text\"\n value={query}\n onChange={(e) => {\n setQuery(e.target.value)\n setShowDropdown(true)\n }}\n onKeyDown={handleKeyDown}\n onPaste={handlePaste}\n onFocus={() => setShowDropdown(true)}\n role=\"combobox\"\n aria-expanded={showDropdown && results.length > 0}\n aria-autocomplete=\"list\"\n aria-controls=\"email-composer-suggestions\"\n aria-label={`${label} recipients`}\n onBlur={() => {\n // delay to allow dropdown click to fire\n if (blurTimerRef.current !== undefined) {\n clearTimeout(blurTimerRef.current)\n }\n blurTimerRef.current = setTimeout(() => {\n blurTimerRef.current = undefined\n setShowDropdown(false)\n if (query.trim() !== '') addEmailFromText(query)\n }, 200)\n }}\n placeholder={value.length === 0 ? (placeholder ?? `${label.toLowerCase()}@example.com`) : ''}\n className=\"flex-1 min-w-[120px] bg-transparent gds-text-body text-fg placeholder:text-fg-muted/30 outline-none\"\n />\n </div>\n\n {showDropdown && results.length > 0 && (\n <SuggestionDropdown\n results={results}\n activeIndex={activeIndex}\n onSelect={addContact}\n />\n )}\n </div>\n )\n },\n)\n","// inline-edit — editable text with confirm/cancel buttons and validation\nimport { forwardRef, useCallback, useState } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\n\nexport type InlineEditProps = {\n value: string\n onSave: (value: string) => void\n onCancel?: () => void\n validate?: (value: string) => string | null\n placeholder?: string\n disabled?: boolean\n className?: string\n}\n\nconst checkIcon = (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M2.5 7.5l3 3 6-6.5\" />\n </svg>\n)\n\nconst cancelIcon = (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\">\n <path d=\"M3 3l8 8M11 3l-8 8\" />\n </svg>\n)\n\nconst editIcon = (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M7 2l3 3-7 7H0V9z\" />\n </svg>\n)\n\nexport const InlineEdit = forwardRef<HTMLDivElement, InlineEditProps>(\n function InlineEdit({ value, onSave, onCancel, validate, placeholder = 'Click to edit', disabled, className }, ref) {\n const [editing, setEditing] = useState(false)\n const [editValue, setEditValue] = useState(value)\n const [error, setError] = useState<string | null>(null)\n\n const startEditing = useCallback(() => {\n if (disabled === true) return\n setEditValue(value)\n setError(null)\n setEditing(true)\n }, [disabled, value])\n\n const save = useCallback(() => {\n if (validate !== undefined) {\n const err = validate(editValue)\n if (err !== null) {\n setError(err)\n return\n }\n }\n setEditing(false)\n setError(null)\n onSave(editValue)\n }, [editValue, onSave, validate])\n\n const cancel = useCallback(() => {\n setEditing(false)\n setEditValue(value)\n setError(null)\n if (onCancel !== undefined) {\n onCancel()\n }\n }, [onCancel, value])\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter') {\n save()\n }\n if (e.key === 'Escape') {\n cancel()\n }\n },\n [save, cancel],\n )\n\n if (editing) {\n return (\n <div ref={ref} className={cx('inline-flex flex-col', className)} data-component=\"inline-edit\" data-state=\"editing\">\n <div className=\"flex items-center gap-1\">\n <input\n autoFocus\n className={cx(\n 'bg-transparent gds-text-body text-fg outline-none border-b border-accent/50 px-0.5',\n error !== null && 'border-danger/50',\n focusCls,\n )}\n onChange={(e) => { setEditValue(e.target.value); setError(null) }}\n onKeyDown={handleKeyDown}\n type=\"text\"\n value={editValue}\n />\n <button type=\"button\" onClick={save} className={cx('shrink-0 p-0.5 text-success hover:text-success/80', focusCls)} aria-label=\"Save\">\n {checkIcon}\n </button>\n <button type=\"button\" onClick={cancel} className={cx('shrink-0 p-0.5 text-fg-muted hover:text-fg', focusCls)} aria-label=\"Cancel\">\n {cancelIcon}\n </button>\n </div>\n {error !== null && <span className=\"mt-0.5 text-[10px] text-danger\">{error}</span>}\n </div>\n )\n }\n\n const isEmpty = value === ''\n\n return (\n <div\n ref={ref}\n className={cx('group inline-flex cursor-pointer items-center gap-1', disabled === true && 'pointer-events-none opacity-50', className)}\n data-component=\"inline-edit\"\n data-state=\"display\"\n onClick={startEditing}\n onKeyDown={(e) => { if (e.key === 'Enter' || e.key === ' ') startEditing() }}\n role=\"button\"\n tabIndex={disabled === true ? -1 : 0}\n >\n <span className={cx('gds-text-body', isEmpty ? 'text-fg-muted' : 'text-fg', focusCls)}>\n {isEmpty ? placeholder : value}\n </span>\n <span className=\"text-fg-muted/0 transition-colors group-hover:text-fg-muted/60\">{editIcon}</span>\n </div>\n )\n },\n)\n","// list-item — structured list row with icon, title, description, and trailing element\nimport type { ReactNode } from 'react'\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\nexport type ListItemProps = {\n icon?: ReactNode\n title: string\n description?: string\n trailing?: ReactNode\n onClick?: () => void\n active?: boolean\n disabled?: boolean\n className?: string\n}\n\nexport const ListItem = forwardRef<HTMLDivElement, ListItemProps>(\n function ListItem({ icon, title, description, trailing, onClick, active, disabled, className }, ref) {\n const isClickable = onClick !== undefined && disabled !== true\n\n return (\n <div\n ref={ref}\n role={isClickable ? 'button' : undefined}\n tabIndex={isClickable ? 0 : undefined}\n onClick={isClickable ? onClick : undefined}\n onKeyDown={isClickable ? (e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n onClick()\n }\n } : undefined}\n className={cx(\n 'flex items-center gap-3 gds-pad-x gds-pad-y-sm gds-text-body select-none',\n isClickable && 'cursor-pointer hover:bg-bg-tertiary',\n active === true && 'border-l-2 border-l-accent bg-accent/5',\n disabled === true && 'pointer-events-none opacity-50',\n className,\n )}\n data-component=\"list-item\"\n data-state={active === true ? 'active' : undefined}\n >\n {icon !== undefined && <span className=\"shrink-0 text-fg-muted\">{icon}</span>}\n <div className=\"min-w-0 flex-1\">\n <div className=\"font-medium text-fg\">{title}</div>\n {description !== undefined && (\n <div className=\"mt-0.5 text-fg-muted gds-text-caption\">{description}</div>\n )}\n </div>\n {trailing !== undefined && <span className=\"shrink-0\">{trailing}</span>}\n </div>\n )\n },\n)\n","// notification — persistent banner with variant, title, description, and action\nimport type { ReactNode } from 'react'\nimport { forwardRef } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\nimport { glassClass } from '../utils/glass'\n\ntype NotificationVariant = 'danger' | 'info' | 'success' | 'warning'\n\nconst borderColorMap: Record<NotificationVariant, string> = {\n info: 'border-l-accent',\n success: 'border-l-success',\n warning: 'border-l-warning',\n danger: 'border-l-danger',\n}\n\nconst bgColorMap: Record<NotificationVariant, string> = {\n info: 'bg-accent/5',\n success: 'bg-success/5',\n warning: 'bg-warning/5',\n danger: 'bg-danger/5',\n}\n\nconst iconColorMap: Record<NotificationVariant, string> = {\n info: 'text-accent',\n success: 'text-success',\n warning: 'text-warning',\n danger: 'text-danger',\n}\n\nconst iconMap: Record<NotificationVariant, ReactNode> = {\n info: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\">\n <circle cx=\"8\" cy=\"8\" r=\"6.5\" /><path d=\"M8 5.5h.01M8 7.5v3\" />\n </svg>\n ),\n success: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <circle cx=\"8\" cy=\"8\" r=\"6.5\" /><path d=\"M5.5 8l2 2 3-3.5\" />\n </svg>\n ),\n warning: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\">\n <path d=\"M7.13 2.5l-5.5 10h11l-5.5-10z\" /><path d=\"M7.63 6.5v2.5M7.63 11h.01\" />\n </svg>\n ),\n danger: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\">\n <circle cx=\"8\" cy=\"8\" r=\"6.5\" /><path d=\"M5.5 5.5l5 5M10.5 5.5l-5 5\" />\n </svg>\n ),\n}\n\ntype NotificationProps = React.HTMLAttributes<HTMLDivElement> & {\n title: string\n description?: string\n variant?: NotificationVariant\n action?: ReactNode\n onClose?: () => void\n glass?: boolean\n}\n\nconst Notification = forwardRef<HTMLDivElement, NotificationProps>(\n function Notification({ title, description, variant = 'info', action, onClose, glass, className, ...props }, ref) {\n const v = variant ?? 'info'\n\n return (\n <div\n ref={ref}\n className={cx(\n 'flex w-full items-start gds-gap gds-radius-popover border border-border border-l-2 gds-pad-x gds-pad-y',\n borderColorMap[v],\n bgColorMap[v],\n glass === true && glassClass(glass),\n className,\n )}\n data-component=\"notification\"\n data-variant={v}\n role=\"alert\"\n {...props}\n >\n <span className={cx('mt-px shrink-0', iconColorMap[v])}>{iconMap[v]}</span>\n <div className=\"min-w-0 flex-1\">\n <p className=\"gds-text-body font-medium text-fg\">{title}</p>\n {description !== undefined && <p className=\"mt-0.5 gds-text-label text-fg-muted\">{description}</p>}\n </div>\n {action !== undefined && <div className=\"shrink-0\">{action}</div>}\n {onClose !== undefined && (\n <button\n type=\"button\"\n onClick={onClose}\n className={cx('shrink-0 gds-radius-button p-0.5 text-fg-muted opacity-60 hover:opacity-100', focusCls)}\n aria-label=\"Dismiss\"\n >\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\">\n <path d=\"M2 2l8 8M10 2l-8 8\" />\n </svg>\n </button>\n )}\n </div>\n )\n },\n)\n\nexport { Notification }\nexport type { NotificationProps, NotificationVariant }\n","import { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype TaskItemPriority = 'low' | 'medium' | 'high' | 'critical'\n\ntype TaskItemProps = React.HTMLAttributes<HTMLDivElement> & {\n completed?: boolean\n dueDate?: string\n onToggle?: () => void\n priority?: TaskItemPriority\n title: string\n}\n\nconst priorityCls: Record<TaskItemPriority, string> = {\n low: 'bg-success/15 text-success',\n medium: 'bg-warning/15 text-warning',\n high: 'bg-danger/15 text-danger',\n critical: 'bg-danger text-white',\n}\n\nconst TaskItem = forwardRef<HTMLDivElement, TaskItemProps>(\n function TaskItem({ className, completed = false, dueDate, onToggle, priority, title, ...props }, ref) {\n return (\n <div\n className={cx('flex items-center gap-2 rounded px-2 py-1.5 text-sm', className)}\n data-component=\"task-item\"\n data-completed={completed}\n ref={ref}\n {...props}\n >\n <input\n checked={completed}\n className=\"shrink-0 accent-accent\"\n onChange={onToggle}\n type=\"checkbox\"\n />\n <span className={cx('flex-1 truncate', completed && 'line-through text-fg-muted')}>{title}</span>\n {priority !== undefined && (\n <span className={cx('rounded px-1.5 py-0.5 text-[10px] font-medium uppercase', priorityCls[priority])}>{priority}</span>\n )}\n {dueDate !== undefined && (\n <span className=\"shrink-0 text-xs text-fg-muted\">{dueDate}</span>\n )}\n </div>\n )\n },\n)\n\nexport { TaskItem }\nexport type { TaskItemPriority, TaskItemProps }\n","// toast — notification card with variant, title, description, and action\nimport type { ReactNode } from 'react'\nimport { forwardRef } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\n\nexport type ToastVariant = 'danger' | 'default' | 'success' | 'warning'\n\nconst borderColorMap: Record<ToastVariant, string> = {\n default: 'border-l-accent',\n success: 'border-l-success',\n warning: 'border-l-warning',\n danger: 'border-l-danger',\n}\n\nconst iconMap: Record<ToastVariant, ReactNode> = {\n default: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\">\n <circle cx=\"8\" cy=\"8\" r=\"6.5\" /><path d=\"M8 5.5h.01M8 7.5v3\" />\n </svg>\n ),\n success: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <circle cx=\"8\" cy=\"8\" r=\"6.5\" /><path d=\"M5.5 8l2 2 3-3.5\" />\n </svg>\n ),\n warning: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\">\n <path d=\"M7.13 2.5l-5.5 10h11l-5.5-10z\" /><path d=\"M7.63 6.5v2.5M7.63 11h.01\" />\n </svg>\n ),\n danger: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\">\n <circle cx=\"8\" cy=\"8\" r=\"6.5\" /><path d=\"M5.5 5.5l5 5M10.5 5.5l-5 5\" />\n </svg>\n ),\n}\n\nconst iconColorMap: Record<ToastVariant, string> = {\n default: 'text-accent',\n success: 'text-success',\n warning: 'text-warning',\n danger: 'text-danger',\n}\n\nexport type ToastProps = React.HTMLAttributes<HTMLDivElement> & {\n title: string\n description?: string\n variant?: ToastVariant\n onClose?: () => void\n action?: ReactNode\n}\n\nexport const Toast = forwardRef<HTMLDivElement, ToastProps>(\n function Toast({ title, description, variant = 'default', onClose, action, className, ...props }, ref) {\n return (\n <div\n ref={ref}\n className={cx(\n 'flex items-start gds-gap gds-radius-popover border border-border border-l-4 bg-surface gds-pad-x gds-pad-y gds-shadow-lg',\n borderColorMap[variant],\n className,\n )}\n data-component=\"toast\"\n data-variant={variant}\n role=\"status\"\n {...props}\n >\n <span className={cx('mt-px shrink-0', iconColorMap[variant])}>{iconMap[variant]}</span>\n <div className=\"min-w-0 flex-1\">\n <p className=\"gds-text-body font-medium text-fg\">{title}</p>\n {description !== undefined && <p className=\"mt-0.5 gds-text-label text-fg-muted\">{description}</p>}\n </div>\n {action !== undefined && <div className=\"shrink-0\">{action}</div>}\n {onClose !== undefined && (\n <button\n type=\"button\"\n onClick={onClose}\n className={cx('shrink-0 gds-radius-button p-0.5 text-fg-muted opacity-60 hover:opacity-100', focusCls)}\n aria-label=\"Dismiss\"\n >\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\">\n <path d=\"M2 2l8 8M10 2l-8 8\" />\n </svg>\n </button>\n )}\n </div>\n )\n },\n)\n"],"mappings":"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"}
|
package/dist/tokens.css
CHANGED
|
@@ -222,6 +222,7 @@
|
|
|
222
222
|
|
|
223
223
|
/* speed variants — override default timing */
|
|
224
224
|
@utility animate-fast { animation-duration: var(--gds-duration-fast, 100ms); }
|
|
225
|
+
@utility animate-medium { animation-duration: var(--gds-duration-medium, 150ms); }
|
|
225
226
|
@utility animate-slow { animation-duration: var(--gds-duration-slow, 300ms); }
|
|
226
227
|
|
|
227
228
|
/* prefers-reduced-motion — global kill switch */
|
|
@@ -257,3 +258,7 @@
|
|
|
257
258
|
.gds-ctx .gds-ctx { --gds-ctx-gap: 12px; --gds-ctx-pad: 12px; --gds-ctx-radius: 8px; --gds-ctx-shadow: none; --gds-ctx-text: 11px; --gds-ctx-heading: 13px; --gds-ctx-fg-alpha: 0.88; }
|
|
258
259
|
.gds-ctx .gds-ctx .gds-ctx { --gds-ctx-gap: 8px; --gds-ctx-pad: 8px; --gds-ctx-radius: 6px; --gds-ctx-shadow: none; --gds-ctx-text: 10px; --gds-ctx-heading: 12px; --gds-ctx-fg-alpha: 0.80; }
|
|
259
260
|
.gds-ctx .gds-ctx .gds-ctx .gds-ctx { --gds-ctx-gap: 6px; --gds-ctx-pad: 6px; --gds-ctx-radius: 4px; --gds-ctx-shadow: none; --gds-ctx-text: 10px; --gds-ctx-heading: 11px; --gds-ctx-fg-alpha: 0.72; }
|
|
261
|
+
|
|
262
|
+
/* depth reset — escape hatch for deep nesting (e.g. EmailThread > message > attachment > preview) */
|
|
263
|
+
.gds-ctx-reset { --gds-ctx-gap: 16px; --gds-ctx-pad: 16px; --gds-ctx-radius: 10px; --gds-ctx-shadow: var(--gds-shadow-sm); --gds-ctx-text: 12px; --gds-ctx-heading: 14px; --gds-ctx-fg-alpha: 0.95; }
|
|
264
|
+
@utility gds-ctx-reset { --gds-ctx-gap: 16px; --gds-ctx-pad: 16px; --gds-ctx-radius: 10px; --gds-ctx-shadow: var(--gds-shadow-sm); --gds-ctx-text: 12px; --gds-ctx-heading: 14px; --gds-ctx-fg-alpha: 0.95; }
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { F as e, N as t, P as n, l as r, n as i, t as a } from "./scales-
|
|
1
|
+
import { F as e, N as t, P as n, l as r, n as i, t as a } from "./scales-DlVrSOA2.js";
|
|
2
2
|
import { atom as o, useAtom as s, useAtomValue as c } from "jotai";
|
|
3
3
|
import { useCallback as l, useEffect as u, useRef as d } from "react";
|
|
4
4
|
//#region src/l1-systems/theme.ts
|
|
@@ -29,47 +29,72 @@ function g(e, t, n) {
|
|
|
29
29
|
for (let [t, n] of Object.entries(e)) r.style.setProperty(t, n);
|
|
30
30
|
return i;
|
|
31
31
|
}
|
|
32
|
-
var _ =
|
|
33
|
-
|
|
32
|
+
var _ = {
|
|
33
|
+
default: {
|
|
34
|
+
primaryColor: i,
|
|
35
|
+
shape: "default",
|
|
36
|
+
density: "default",
|
|
37
|
+
elevation: "raised",
|
|
38
|
+
glass: "full",
|
|
39
|
+
motion: "full"
|
|
40
|
+
},
|
|
41
|
+
email: {
|
|
42
|
+
primaryColor: "#3b7ddd",
|
|
43
|
+
shape: "default",
|
|
44
|
+
density: "comfortable",
|
|
45
|
+
elevation: "subtle",
|
|
46
|
+
glass: "subtle",
|
|
47
|
+
motion: "full"
|
|
48
|
+
},
|
|
49
|
+
dashboard: {
|
|
50
|
+
primaryColor: i,
|
|
51
|
+
shape: "default",
|
|
52
|
+
density: "compact",
|
|
53
|
+
elevation: "subtle",
|
|
54
|
+
glass: "off",
|
|
55
|
+
motion: "full"
|
|
56
|
+
}
|
|
57
|
+
}, v = "gds-theme";
|
|
58
|
+
function y(e) {
|
|
34
59
|
try {
|
|
35
|
-
localStorage.setItem(
|
|
60
|
+
localStorage.setItem(v, JSON.stringify(e));
|
|
36
61
|
} catch {}
|
|
37
62
|
}
|
|
38
|
-
function
|
|
63
|
+
function b() {
|
|
39
64
|
try {
|
|
40
|
-
let e = localStorage.getItem(
|
|
65
|
+
let e = localStorage.getItem(v);
|
|
41
66
|
if (e === null) return null;
|
|
42
67
|
let t = JSON.parse(e);
|
|
43
68
|
return {
|
|
44
69
|
...f,
|
|
45
70
|
...t,
|
|
46
71
|
primaryColor: typeof t.primaryColor == "string" && /^#[0-9a-fA-F]{6}$/.test(t.primaryColor) ? t.primaryColor : f.primaryColor,
|
|
47
|
-
shape:
|
|
72
|
+
shape: x(t.shape, [
|
|
48
73
|
"sharp",
|
|
49
74
|
"default",
|
|
50
75
|
"rounded"
|
|
51
76
|
], f.shape),
|
|
52
|
-
density:
|
|
77
|
+
density: x(t.density, [
|
|
53
78
|
"compact",
|
|
54
79
|
"default",
|
|
55
80
|
"comfortable"
|
|
56
81
|
], f.density),
|
|
57
|
-
elevation:
|
|
82
|
+
elevation: x(t.elevation, [
|
|
58
83
|
"flat",
|
|
59
84
|
"subtle",
|
|
60
85
|
"raised"
|
|
61
86
|
], f.elevation),
|
|
62
|
-
glass:
|
|
87
|
+
glass: x(t.glass, [
|
|
63
88
|
"off",
|
|
64
89
|
"subtle",
|
|
65
90
|
"full"
|
|
66
91
|
], f.glass),
|
|
67
|
-
motion:
|
|
92
|
+
motion: x(t.motion, [
|
|
68
93
|
"off",
|
|
69
94
|
"reduced",
|
|
70
95
|
"full"
|
|
71
96
|
], f.motion),
|
|
72
|
-
mode:
|
|
97
|
+
mode: x(t.mode, [
|
|
73
98
|
"light",
|
|
74
99
|
"dark",
|
|
75
100
|
"system"
|
|
@@ -79,22 +104,22 @@ function y() {
|
|
|
79
104
|
return null;
|
|
80
105
|
}
|
|
81
106
|
}
|
|
82
|
-
function
|
|
107
|
+
function x(e, t, n) {
|
|
83
108
|
return typeof e == "string" && t.includes(e) ? e : n;
|
|
84
109
|
}
|
|
85
110
|
//#endregion
|
|
86
111
|
//#region src/l1-systems/use-theme.ts
|
|
87
|
-
var
|
|
88
|
-
function
|
|
89
|
-
|
|
112
|
+
var S = { colorPresets: {} };
|
|
113
|
+
function C(e) {
|
|
114
|
+
S = e;
|
|
90
115
|
}
|
|
91
|
-
function
|
|
116
|
+
function w() {
|
|
92
117
|
return c(p);
|
|
93
118
|
}
|
|
94
|
-
function
|
|
119
|
+
function T() {
|
|
95
120
|
return c(m);
|
|
96
121
|
}
|
|
97
|
-
function
|
|
122
|
+
function E() {
|
|
98
123
|
let [, e] = s(p);
|
|
99
124
|
return l((t) => {
|
|
100
125
|
e((e) => ({
|
|
@@ -103,10 +128,10 @@ function T() {
|
|
|
103
128
|
}));
|
|
104
129
|
}, [e]);
|
|
105
130
|
}
|
|
106
|
-
function
|
|
131
|
+
function D() {
|
|
107
132
|
let [, e] = s(p);
|
|
108
133
|
return l((t) => {
|
|
109
|
-
let n =
|
|
134
|
+
let n = S.colorPresets[t]?.primaryColor ?? f.primaryColor;
|
|
110
135
|
e((e) => ({
|
|
111
136
|
...e,
|
|
112
137
|
presetId: t,
|
|
@@ -115,7 +140,7 @@ function E() {
|
|
|
115
140
|
}));
|
|
116
141
|
}, [e]);
|
|
117
142
|
}
|
|
118
|
-
function
|
|
143
|
+
function O() {
|
|
119
144
|
let [, e] = s(p);
|
|
120
145
|
return l((t) => {
|
|
121
146
|
e((e) => ({
|
|
@@ -125,7 +150,7 @@ function D() {
|
|
|
125
150
|
}));
|
|
126
151
|
}, [e]);
|
|
127
152
|
}
|
|
128
|
-
function
|
|
153
|
+
function k() {
|
|
129
154
|
let [, e] = s(p);
|
|
130
155
|
return l((t) => {
|
|
131
156
|
e((e) => ({
|
|
@@ -134,7 +159,7 @@ function O() {
|
|
|
134
159
|
}));
|
|
135
160
|
}, [e]);
|
|
136
161
|
}
|
|
137
|
-
function
|
|
162
|
+
function A() {
|
|
138
163
|
let [, e] = s(p);
|
|
139
164
|
return l((t) => {
|
|
140
165
|
e((e) => ({
|
|
@@ -143,7 +168,7 @@ function k() {
|
|
|
143
168
|
}));
|
|
144
169
|
}, [e]);
|
|
145
170
|
}
|
|
146
|
-
function
|
|
171
|
+
function j() {
|
|
147
172
|
let [, e] = s(p);
|
|
148
173
|
return l((t) => {
|
|
149
174
|
e((e) => ({
|
|
@@ -152,7 +177,7 @@ function A() {
|
|
|
152
177
|
}));
|
|
153
178
|
}, [e]);
|
|
154
179
|
}
|
|
155
|
-
function
|
|
180
|
+
function M() {
|
|
156
181
|
let [, e] = s(p);
|
|
157
182
|
return l((t) => {
|
|
158
183
|
e((e) => ({
|
|
@@ -161,7 +186,7 @@ function j() {
|
|
|
161
186
|
}));
|
|
162
187
|
}, [e]);
|
|
163
188
|
}
|
|
164
|
-
function
|
|
189
|
+
function N() {
|
|
165
190
|
let [, e] = s(p);
|
|
166
191
|
return l((t) => {
|
|
167
192
|
e((e) => ({
|
|
@@ -170,7 +195,7 @@ function M() {
|
|
|
170
195
|
}));
|
|
171
196
|
}, [e]);
|
|
172
197
|
}
|
|
173
|
-
function
|
|
198
|
+
function P() {
|
|
174
199
|
let [, e] = s(p);
|
|
175
200
|
return l((t) => {
|
|
176
201
|
e((e) => ({
|
|
@@ -179,25 +204,25 @@ function N() {
|
|
|
179
204
|
}));
|
|
180
205
|
}, [e]);
|
|
181
206
|
}
|
|
182
|
-
function
|
|
207
|
+
function F() {
|
|
183
208
|
let [, e] = s(p);
|
|
184
209
|
return l(() => {
|
|
185
210
|
e(f);
|
|
186
211
|
}, [e]);
|
|
187
212
|
}
|
|
188
|
-
function
|
|
213
|
+
function I() {
|
|
189
214
|
let e = c(p), t = c(m), n = d([]);
|
|
190
215
|
u(() => {
|
|
191
|
-
n.current = g(h(e, t), t, n.current),
|
|
216
|
+
n.current = g(h(e, t), t, n.current), y(e);
|
|
192
217
|
}, [e, t]), u(() => {
|
|
193
218
|
let e = window.matchMedia("(prefers-color-scheme: dark)"), t = () => {};
|
|
194
219
|
return e.addEventListener("change", t), () => e.removeEventListener("change", t);
|
|
195
220
|
}, []), u(() => {
|
|
196
|
-
let e =
|
|
221
|
+
let e = b();
|
|
197
222
|
e !== null && (n.current = g(h(e, t), t));
|
|
198
223
|
}, []);
|
|
199
224
|
}
|
|
200
225
|
//#endregion
|
|
201
|
-
export { m as _,
|
|
226
|
+
export { m as _, A as a, E as c, O as d, k as f, h as g, f as h, P as i, N as l, I as m, F as n, j as o, w as p, T as r, M as s, C as t, D as u, p as v, _ as y };
|
|
202
227
|
|
|
203
|
-
//# sourceMappingURL=use-theme-
|
|
228
|
+
//# sourceMappingURL=use-theme-BI1t0nvJ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-theme-BI1t0nvJ.js","names":[],"sources":["../src/l1-systems/theme.ts","../src/l1-systems/use-theme.ts"],"sourcesContent":["// L1 — Theme System\n// manages color preset + 5 dimensional axes + dark/light mode\n// applies CSS variable overrides to document root\n// persists to localStorage, syncs across tabs\n\nimport { atom } from 'jotai'\n\nimport { deriveDarkPalette, deriveLightPalette, paletteToVars } from '../l0-tokens/color-derive'\nimport { fontToCssVars } from '../l0-tokens/font-system'\nimport { DEFAULT_PRIMARY } from '../l0-tokens/generate-defaults'\nimport type {\n ThemeDensity,\n ThemeElevation,\n ThemeGlass,\n ThemeMotion,\n ThemeShape,\n} from '../l0-tokens/scales'\nimport { resolveAxesToCssVars } from '../l0-tokens/scales'\n\n// color overrides — per-token overrides for advanced users\nexport type ThemeColorOverrides = {\n '--gds-accent': string\n '--gds-accent-fg': string\n '--gds-accent-hover': string\n '--gds-danger': string\n '--gds-success': string\n '--gds-warning': string\n}\n\nexport type ThemeMode = 'dark' | 'light' | 'system'\n\n// full theme state — what the user has configured\nexport type ThemeState = {\n mode: ThemeMode\n primaryColor: string // single source — everything derived from this\n presetId: string // for UI display only (\"default\", \"teal\", \"amber\"...)\n // dimensional axes — each constrained to L0 scale options\n shape: ThemeShape\n density: ThemeDensity\n elevation: ThemeElevation\n glass: ThemeGlass\n motion: ThemeMotion\n // optional per-token color overrides (advanced — overrides derivation)\n colorOverrides: Partial<ThemeColorOverrides> | null\n}\n\n// default theme — beautiful out of the box\nexport const DEFAULT_THEME: ThemeState = {\n mode: 'system',\n primaryColor: DEFAULT_PRIMARY,\n presetId: 'default',\n shape: 'default',\n density: 'default',\n elevation: 'raised',\n glass: 'full',\n motion: 'full',\n colorOverrides: null,\n}\n\n// jotai atoms — reactive theme state\nexport const themeAtom = atom<ThemeState>(DEFAULT_THEME)\n\nexport const resolvedModeAtom = atom<'dark' | 'light'>((get) => {\n const { mode } = get(themeAtom)\n if (mode !== 'system') return mode\n if (typeof window === 'undefined') return 'dark'\n return window.matchMedia('(prefers-color-scheme: dark)').matches\n ? 'dark'\n : 'light'\n})\n\n// resolve theme state → flat CSS variable overrides\n// all colors derived from primaryColor via L0 functions — no manual color presets\nexport function resolveThemeCssVars(\n state: ThemeState,\n resolvedMode: 'dark' | 'light',\n): Record<string, string> {\n // 1. derive colors from primaryColor\n const palette = resolvedMode === 'dark'\n ? deriveDarkPalette(state.primaryColor)\n : deriveLightPalette(state.primaryColor)\n const vars: Record<string, string> = { ...paletteToVars(palette, resolvedMode) }\n\n // 2. font stacks + weights\n Object.assign(vars, fontToCssVars())\n\n // 3. dimensional axes — computed by L0 system functions\n Object.assign(vars, resolveAxesToCssVars(\n state.shape, state.density, state.elevation,\n state.glass, state.motion, resolvedMode,\n ))\n\n // 4. per-token color overrides (highest priority — advanced users)\n if (state.colorOverrides !== null) {\n for (const [key, val] of Object.entries(state.colorOverrides)) {\n if (val !== undefined) {\n vars[key] = val\n }\n }\n }\n\n return vars\n}\n\n// apply resolved vars to document\nexport function applyThemeToDocument(\n vars: Record<string, string>,\n resolvedMode: 'dark' | 'light',\n previousKeys?: string[],\n): string[] {\n const root = document.documentElement\n\n // clear previous overrides\n if (previousKeys !== undefined) {\n for (const key of previousKeys) {\n root.style.removeProperty(key)\n }\n }\n\n // set mode attribute\n const mode = root.getAttribute('data-theme-mode')\n if (mode !== resolvedMode) {\n root.setAttribute('data-theme-mode', resolvedMode)\n }\n\n // apply new overrides\n const keys = Object.keys(vars)\n for (const [key, val] of Object.entries(vars)) {\n root.style.setProperty(key, val)\n }\n\n return keys\n}\n\n// named theme presets — optimized axis combinations for specific application types\nexport type ThemePreset = Omit<ThemeState, 'mode' | 'presetId' | 'colorOverrides'>\n\nexport const themePresets = {\n // default: balanced for general-purpose dashboards\n default: {\n primaryColor: DEFAULT_PRIMARY,\n shape: 'default' as const,\n density: 'default' as const,\n elevation: 'raised' as const,\n glass: 'full' as const,\n motion: 'full' as const,\n },\n // email: optimized for email/productivity apps (mailrs-proven)\n // comfortable density for readable 14px base, subtle elevation for clean modern look\n email: {\n primaryColor: '#3b7ddd', // slightly desaturated blue, validated in production\n shape: 'default' as const,\n density: 'comfortable' as const,\n elevation: 'subtle' as const,\n glass: 'subtle' as const,\n motion: 'full' as const,\n },\n // dashboard: data-dense monitoring/analytics\n dashboard: {\n primaryColor: DEFAULT_PRIMARY,\n shape: 'default' as const,\n density: 'compact' as const,\n elevation: 'subtle' as const,\n glass: 'off' as const,\n motion: 'full' as const,\n },\n} as const satisfies Record<string, ThemePreset>\n\nexport type ThemePresetId = keyof typeof themePresets\n\n// persistence keys\nconst STORAGE_KEY = 'gds-theme'\n\nexport function persistTheme(state: ThemeState): void {\n try {\n localStorage.setItem(STORAGE_KEY, JSON.stringify(state))\n } catch {\n // storage full or unavailable\n }\n}\n\nexport function loadPersistedTheme(): ThemeState | null {\n try {\n const raw = localStorage.getItem(STORAGE_KEY)\n if (raw === null) return null\n const parsed = JSON.parse(raw) as Partial<ThemeState>\n // validate and merge with defaults to handle schema evolution\n return {\n ...DEFAULT_THEME,\n ...parsed,\n // validate primaryColor is a hex string\n primaryColor: typeof parsed.primaryColor === 'string' && /^#[0-9a-fA-F]{6}$/.test(parsed.primaryColor)\n ? parsed.primaryColor : DEFAULT_THEME.primaryColor,\n // ensure constrained values are valid\n shape: validateOption(parsed.shape, ['sharp', 'default', 'rounded'], DEFAULT_THEME.shape),\n density: validateOption(parsed.density, ['compact', 'default', 'comfortable'], DEFAULT_THEME.density),\n elevation: validateOption(parsed.elevation, ['flat', 'subtle', 'raised'], DEFAULT_THEME.elevation),\n glass: validateOption(parsed.glass, ['off', 'subtle', 'full'], DEFAULT_THEME.glass),\n motion: validateOption(parsed.motion, ['off', 'reduced', 'full'], DEFAULT_THEME.motion),\n mode: validateOption(parsed.mode, ['light', 'dark', 'system'], DEFAULT_THEME.mode),\n }\n } catch {\n return null\n }\n}\n\nfunction validateOption<T extends string>(\n value: unknown,\n options: T[],\n fallback: T,\n): T {\n if (typeof value === 'string' && options.includes(value as T)) {\n return value as T\n }\n return fallback\n}\n","// L1 — theme hooks\n// components use these to read/write theme state\n// all changes go through constrained API — no raw CSS manipulation\n\nimport { useAtom, useAtomValue } from 'jotai'\nimport { useCallback, useEffect, useRef } from 'react'\n\nimport type { ThemeDensity, ThemeElevation, ThemeGlass, ThemeMotion, ThemeShape } from '../l0-tokens/scales'\nimport type { ThemeColorOverrides, ThemeMode, ThemeState } from './theme'\nimport {\n applyThemeToDocument,\n DEFAULT_THEME,\n loadPersistedTheme,\n persistTheme,\n resolvedModeAtom,\n resolveThemeCssVars,\n themeAtom,\n} from './theme'\n\n// color presets — app registers named presets, each is just a primaryColor\ntype ThemeConfig = {\n colorPresets: Record<string, { primaryColor: string }>\n}\n\nlet themeConfig: ThemeConfig = { colorPresets: {} }\n\n// called once at app init — register named color presets\nexport function configureTheme(config: ThemeConfig): void {\n themeConfig = config\n}\n\n// read current theme state (reactive)\nexport function useTheme(): ThemeState {\n return useAtomValue(themeAtom)\n}\n\n// read resolved dark/light mode (reactive)\nexport function useResolvedMode(): 'dark' | 'light' {\n return useAtomValue(resolvedModeAtom)\n}\n\n// theme mutation hooks — each returns a setter for one axis\nexport function useSetThemeMode(): (mode: ThemeMode) => void {\n const [, setTheme] = useAtom(themeAtom)\n return useCallback((mode: ThemeMode) => {\n setTheme((prev) => ({ ...prev, mode }))\n }, [setTheme])\n}\n\nexport function useSetThemePreset(): (presetId: string) => void {\n const [, setTheme] = useAtom(themeAtom)\n return useCallback((presetId: string) => {\n const preset = themeConfig.colorPresets[presetId]\n const primaryColor = preset?.primaryColor ?? DEFAULT_THEME.primaryColor\n setTheme((prev) => ({ ...prev, presetId, primaryColor, colorOverrides: null }))\n }, [setTheme])\n}\n\nexport function useSetThemePrimaryColor(): (color: string) => void {\n const [, setTheme] = useAtom(themeAtom)\n return useCallback((primaryColor: string) => {\n setTheme((prev) => ({ ...prev, primaryColor, colorOverrides: null }))\n }, [setTheme])\n}\n\nexport function useSetThemeShape(): (shape: ThemeShape) => void {\n const [, setTheme] = useAtom(themeAtom)\n return useCallback((shape: ThemeShape) => {\n setTheme((prev) => ({ ...prev, shape }))\n }, [setTheme])\n}\n\nexport function useSetThemeDensity(): (density: ThemeDensity) => void {\n const [, setTheme] = useAtom(themeAtom)\n return useCallback((density: ThemeDensity) => {\n setTheme((prev) => ({ ...prev, density }))\n }, [setTheme])\n}\n\nexport function useSetThemeElevation(): (elevation: ThemeElevation) => void {\n const [, setTheme] = useAtom(themeAtom)\n return useCallback((elevation: ThemeElevation) => {\n setTheme((prev) => ({ ...prev, elevation }))\n }, [setTheme])\n}\n\nexport function useSetThemeGlass(): (glass: ThemeGlass) => void {\n const [, setTheme] = useAtom(themeAtom)\n return useCallback((glass: ThemeGlass) => {\n setTheme((prev) => ({ ...prev, glass }))\n }, [setTheme])\n}\n\nexport function useSetThemeMotion(): (motion: ThemeMotion) => void {\n const [, setTheme] = useAtom(themeAtom)\n return useCallback((motion: ThemeMotion) => {\n setTheme((prev) => ({ ...prev, motion }))\n }, [setTheme])\n}\n\nexport function useSetThemeColors(): (overrides: Partial<ThemeColorOverrides> | null) => void {\n const [, setTheme] = useAtom(themeAtom)\n return useCallback((colorOverrides: Partial<ThemeColorOverrides> | null) => {\n setTheme((prev) => ({ ...prev, colorOverrides }))\n }, [setTheme])\n}\n\nexport function useResetTheme(): () => void {\n const [, setTheme] = useAtom(themeAtom)\n return useCallback(() => {\n setTheme(DEFAULT_THEME)\n }, [setTheme])\n}\n\n// side-effect hook: apply theme to DOM + persist + listen to system changes\n// call this ONCE in the app root\nexport function useThemeEffect(): void {\n const theme = useAtomValue(themeAtom)\n const resolvedMode = useAtomValue(resolvedModeAtom)\n const prevKeysRef = useRef<string[]>([])\n\n // apply to DOM whenever theme changes\n useEffect(() => {\n const vars = resolveThemeCssVars(theme, resolvedMode)\n prevKeysRef.current = applyThemeToDocument(vars, resolvedMode, prevKeysRef.current)\n persistTheme(theme)\n }, [theme, resolvedMode])\n\n // listen for system theme preference changes\n useEffect(() => {\n const mq = window.matchMedia('(prefers-color-scheme: dark)')\n const handler = () => {\n // trigger re-render via resolvedModeAtom re-evaluation\n // jotai derived atoms auto-recompute, but we need to force it\n // by touching the base atom (no-op write)\n }\n mq.addEventListener('change', handler)\n return () => mq.removeEventListener('change', handler)\n }, [])\n\n // restore from localStorage on mount\n useEffect(() => {\n const persisted = loadPersistedTheme()\n if (persisted !== null) {\n // apply directly without going through atom to avoid flash\n const vars = resolveThemeCssVars(persisted, resolvedMode)\n prevKeysRef.current = applyThemeToDocument(vars, resolvedMode)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n}\n"],"mappings":"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"}
|
package/dist/utils/index.d.ts
CHANGED
|
@@ -8,4 +8,6 @@ export { useClickOutside, useEscapeKey, useFocusTrap, useIsDesktop, useIsMobile,
|
|
|
8
8
|
export { motionClass, motionClassWithSpeed } from './motion';
|
|
9
9
|
export { renderPortal } from './portal';
|
|
10
10
|
export type { Align, AsProps, ButtonProps, ComponentBase, DataAttributes, DataRecord, DivProps, GlassMotionProps, InputProps, MergeProps, MotionPreset, Orientation, PartialExcept, Placement, RequireKeys, Side, Size, SvgProps, VariantProps, } from './types';
|
|
11
|
+
export type { SanitizeConfig } from './sanitize';
|
|
12
|
+
export { sanitizeEmailHtml } from './sanitize';
|
|
11
13
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AACzC,OAAO,EAAE,EAAE,EAAE,MAAM,MAAM,CAAA;AACzB,OAAO,EAAE,KAAK,EAAE,eAAe,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,OAAO,CAAA;AAC9D,YAAY,EAAE,WAAW,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AACrE,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AACzE,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAClD,OAAO,EACL,eAAe,EAAE,YAAY,EAAE,YAAY,EAC3C,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,aAAa,GACxD,MAAM,SAAS,CAAA;AAChB,OAAO,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAA;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AACvC,YAAY,EACV,KAAK,EACL,OAAO,EACP,WAAW,EACX,aAAa,EACb,cAAc,EACd,UAAU,EACV,QAAQ,EACR,gBAAgB,EAChB,UAAU,EACV,UAAU,EACV,YAAY,EACZ,WAAW,EACX,aAAa,EACb,SAAS,EACT,WAAW,EACX,IAAI,EACJ,IAAI,EACJ,QAAQ,EACR,YAAY,GACb,MAAM,SAAS,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AACzC,OAAO,EAAE,EAAE,EAAE,MAAM,MAAM,CAAA;AACzB,OAAO,EAAE,KAAK,EAAE,eAAe,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,OAAO,CAAA;AAC9D,YAAY,EAAE,WAAW,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AACrE,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AACzE,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAClD,OAAO,EACL,eAAe,EAAE,YAAY,EAAE,YAAY,EAC3C,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,aAAa,GACxD,MAAM,SAAS,CAAA;AAChB,OAAO,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAA;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AACvC,YAAY,EACV,KAAK,EACL,OAAO,EACP,WAAW,EACX,aAAa,EACb,cAAc,EACd,UAAU,EACV,QAAQ,EACR,gBAAgB,EAChB,UAAU,EACV,UAAU,EACV,YAAY,EACZ,WAAW,EACX,aAAa,EACb,SAAS,EACT,WAAW,EACX,IAAI,EACJ,IAAI,EACJ,QAAQ,EACR,YAAY,GACb,MAAM,SAAS,CAAA;AAKhB,YAAY,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA"}
|
package/dist/utils/index.js
CHANGED
|
@@ -3,5 +3,6 @@ import { i as r, n as i, r as a, t as o } from "../motion-DUPegem-.js";
|
|
|
3
3
|
import { t as s } from "../portal-Bbl6F_Wj.js";
|
|
4
4
|
import { i as c, n as l, r as u, t as d } from "../dom-17XgfxMq.js";
|
|
5
5
|
import { a as f, i as p, n as m, o as h, r as g, s as _, t as v } from "../hooks-BE-_EmDI.js";
|
|
6
|
-
import {
|
|
7
|
-
|
|
6
|
+
import { t as y } from "../sanitize-BF45M9xp.js";
|
|
7
|
+
import { i as b, n as x, r as S, t as C } from "../gesture-I79dlTuS.js";
|
|
8
|
+
export { C as applyInertia, d as clamp, t as cx, a as focusCls, n as glassClass, e as glassSurface, l as isActivationKey, u as mergeRefs, o as motionClass, i as motionClassWithSpeed, s as renderPortal, y as sanitizeEmailHtml, r as srOnly, c as uid, v as useClickOutside, x as useDrag, m as useEscapeKey, g as useFocusTrap, p as useIsDesktop, f as useIsMobile, S as useLongPress, h as useMediaQuery, _ as useScrollLock, b as useSwipe };
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { type Config } from 'dompurify';
|
|
2
|
+
export type SanitizeConfig = Config;
|
|
3
|
+
declare const EMAIL_SANITIZE_CONFIG: SanitizeConfig;
|
|
4
|
+
export declare function sanitizeEmailHtml(html: string): string;
|
|
5
|
+
export declare function sanitizeHtml(html: string, config?: SanitizeConfig): string;
|
|
6
|
+
export { EMAIL_SANITIZE_CONFIG };
|
|
7
|
+
//# sourceMappingURL=sanitize.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sanitize.d.ts","sourceRoot":"","sources":["../../src/utils/sanitize.ts"],"names":[],"mappings":"AAIA,OAAkB,EAAE,KAAK,MAAM,EAAE,MAAM,WAAW,CAAA;AAElD,MAAM,MAAM,cAAc,GAAG,MAAM,CAAA;AAGnC,QAAA,MAAM,qBAAqB,EAAE,cAI5B,CAAA;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,cAAc,GAAG,MAAM,CAE1E;AAED,OAAO,EAAE,qBAAqB,EAAE,CAAA"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export { CodeBlockLowlight as ExtCodeBlockLowlight } from '@tiptap/extension-code-block-lowlight';
|
|
2
|
+
export { Image as ExtImage } from '@tiptap/extension-image';
|
|
3
|
+
export { Link as ExtLink } from '@tiptap/extension-link';
|
|
4
|
+
export { Placeholder as ExtPlaceholder } from '@tiptap/extension-placeholder';
|
|
5
|
+
export { Table as ExtTable, TableCell as ExtTableCell, TableHeader as ExtTableHeader, TableRow as ExtTableRow } from '@tiptap/extension-table';
|
|
6
|
+
export { TaskItem as ExtTaskItem } from '@tiptap/extension-task-item';
|
|
7
|
+
export { TaskList as ExtTaskList } from '@tiptap/extension-task-list';
|
|
8
|
+
export { Underline as ExtUnderline } from '@tiptap/extension-underline';
|
|
9
|
+
export type { Editor, UseEditorOptions } from '@tiptap/react';
|
|
10
|
+
export { EditorContent, useEditor } from '@tiptap/react';
|
|
11
|
+
export { StarterKit } from '@tiptap/starter-kit';
|
|
12
|
+
//# sourceMappingURL=tiptap.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tiptap.d.ts","sourceRoot":"","sources":["../../src/utils/tiptap.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,iBAAiB,IAAI,oBAAoB,EAAE,MAAM,uCAAuC,CAAA;AACjG,OAAO,EAAE,KAAK,IAAI,QAAQ,EAAE,MAAM,yBAAyB,CAAA;AAC3D,OAAO,EAAE,IAAI,IAAI,OAAO,EAAE,MAAM,wBAAwB,CAAA;AACxD,OAAO,EAAE,WAAW,IAAI,cAAc,EAAE,MAAM,+BAA+B,CAAA;AAC7E,OAAO,EAAE,KAAK,IAAI,QAAQ,EAAE,SAAS,IAAI,YAAY,EAAE,WAAW,IAAI,cAAc,EAAC,QAAQ,IAAI,WAAW,EAAE,MAAM,yBAAyB,CAAA;AAC7I,OAAO,EAAE,QAAQ,IAAI,WAAW,EAAE,MAAM,6BAA6B,CAAA;AACrE,OAAO,EAAE,QAAQ,IAAI,WAAW,EAAE,MAAM,6BAA6B,CAAA;AACrE,OAAO,EAAE,SAAS,IAAI,YAAY,EAAE,MAAM,6BAA6B,CAAA;AACvE,YAAY,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAC7D,OAAO,EAAE,aAAa,EAAC,SAAS,EAAE,MAAM,eAAe,CAAA;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@goliapkg/gds",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "2.0.0",
|
|
4
4
|
"description": "GOLIA Design System — enterprise-grade UI component library with contextual depth, glass materials, AI-native structure, and 10 design principles",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -106,7 +106,33 @@
|
|
|
106
106
|
},
|
|
107
107
|
"peerDependencies": {
|
|
108
108
|
"react": ">=19.0.0",
|
|
109
|
-
"react-dom": ">=19.0.0"
|
|
109
|
+
"react-dom": ">=19.0.0",
|
|
110
|
+
"@tiptap/react": "^3.0.0",
|
|
111
|
+
"@tiptap/starter-kit": "^3.0.0",
|
|
112
|
+
"@tiptap/extension-code-block-lowlight": "^3.0.0",
|
|
113
|
+
"@tiptap/extension-image": "^3.0.0",
|
|
114
|
+
"@tiptap/extension-link": "^3.0.0",
|
|
115
|
+
"@tiptap/extension-table": "^3.0.0",
|
|
116
|
+
"@tiptap/extension-task-list": "^3.0.0",
|
|
117
|
+
"@tiptap/extension-task-item": "^3.0.0",
|
|
118
|
+
"@tiptap/extension-underline": "^3.0.0",
|
|
119
|
+
"@tiptap/extension-placeholder": "^3.0.0",
|
|
120
|
+
"lowlight": "^3.0.0",
|
|
121
|
+
"dompurify": "^3.0.0"
|
|
122
|
+
},
|
|
123
|
+
"peerDependenciesMeta": {
|
|
124
|
+
"@tiptap/react": { "optional": true },
|
|
125
|
+
"@tiptap/starter-kit": { "optional": true },
|
|
126
|
+
"@tiptap/extension-code-block-lowlight": { "optional": true },
|
|
127
|
+
"@tiptap/extension-image": { "optional": true },
|
|
128
|
+
"@tiptap/extension-link": { "optional": true },
|
|
129
|
+
"@tiptap/extension-table": { "optional": true },
|
|
130
|
+
"@tiptap/extension-task-list": { "optional": true },
|
|
131
|
+
"@tiptap/extension-task-item": { "optional": true },
|
|
132
|
+
"@tiptap/extension-underline": { "optional": true },
|
|
133
|
+
"@tiptap/extension-placeholder": { "optional": true },
|
|
134
|
+
"lowlight": { "optional": true },
|
|
135
|
+
"dompurify": { "optional": true }
|
|
110
136
|
},
|
|
111
137
|
"dependencies": {
|
|
112
138
|
"class-variance-authority": "^0.7.1",
|
|
@@ -120,11 +146,23 @@
|
|
|
120
146
|
},
|
|
121
147
|
"devDependencies": {
|
|
122
148
|
"@eslint/js": "^10.0.1",
|
|
123
|
-
"react-router": "^7.13.2",
|
|
124
149
|
"@tailwindcss/vite": "^4.2.2",
|
|
125
150
|
"@testing-library/jest-dom": "^6.9.1",
|
|
126
151
|
"@testing-library/react": "^16.3.2",
|
|
127
152
|
"@testing-library/user-event": "^14.6.1",
|
|
153
|
+
"@tiptap/react": "^3.0.0",
|
|
154
|
+
"@tiptap/starter-kit": "^3.0.0",
|
|
155
|
+
"@tiptap/extension-code-block-lowlight": "^3.0.0",
|
|
156
|
+
"@tiptap/extension-image": "^3.0.0",
|
|
157
|
+
"@tiptap/extension-link": "^3.0.0",
|
|
158
|
+
"@tiptap/extension-table": "^3.0.0",
|
|
159
|
+
"@tiptap/extension-task-list": "^3.0.0",
|
|
160
|
+
"@tiptap/extension-task-item": "^3.0.0",
|
|
161
|
+
"@tiptap/extension-underline": "^3.0.0",
|
|
162
|
+
"@tiptap/extension-placeholder": "^3.0.0",
|
|
163
|
+
"lowlight": "^3.0.0",
|
|
164
|
+
"dompurify": "^3.0.0",
|
|
165
|
+
"@types/dompurify": "^3.0.0",
|
|
128
166
|
"@types/react": "^19.2.14",
|
|
129
167
|
"@types/react-dom": "^19.2.3",
|
|
130
168
|
"@vitejs/plugin-react": "^6.0.1",
|
|
@@ -136,6 +174,7 @@
|
|
|
136
174
|
"happy-dom": "^20.8.7",
|
|
137
175
|
"react": "^19.2.4",
|
|
138
176
|
"react-dom": "^19.2.4",
|
|
177
|
+
"react-router": "^7.13.2",
|
|
139
178
|
"typescript": "^5.9.3",
|
|
140
179
|
"typescript-eslint": "^8.57.2",
|
|
141
180
|
"vite": "^8.0.2",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"l2-primitives-Le0006ck.js","names":[],"sources":["../src/l2-primitives/anchor.tsx","../src/l2-primitives/badge-dot.tsx","../src/l2-primitives/container.tsx","../src/l2-primitives/divider.tsx","../src/l2-primitives/dot.tsx","../src/l2-primitives/focus-ring.tsx","../src/l2-primitives/glow-effect.tsx","../src/l2-primitives/gradient-border.tsx","../src/l2-primitives/loading.tsx","../src/l2-primitives/number-stepper.tsx","../src/l2-primitives/number-input.tsx","../src/l2-primitives/screen-overlay.tsx","../src/l2-primitives/scroll-area.tsx","../src/l2-primitives/shimmer.tsx","../src/l2-primitives/skip-nav.tsx","../src/l2-primitives/slider.tsx","../src/l2-primitives/truncate.tsx","../src/l2-primitives/visually-hidden.tsx"],"sourcesContent":["import { cva } from 'class-variance-authority'\nimport type { ReactNode } from 'react'\nimport { forwardRef } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\nimport type { VariantProps } from '../utils/types'\n\nconst anchorVariants = cva(\n 'inline-flex items-center gds-gap-xs underline-offset-2 transition-colors hover:underline ' +\n focusCls,\n {\n defaultVariants: {\n variant: 'default',\n },\n variants: {\n variant: {\n default: 'text-accent hover:text-accent/80',\n muted: 'text-fg-muted hover:text-fg',\n },\n },\n },\n)\n\ntype AnchorProps = React.AnchorHTMLAttributes<HTMLAnchorElement> &\n VariantProps<typeof anchorVariants> & {\n external?: boolean\n externalIcon?: ReactNode\n }\n\nexport const Anchor = forwardRef<HTMLAnchorElement, AnchorProps>(\n function Anchor(\n { children, className, external = false, externalIcon, variant, ...props },\n ref,\n ) {\n return (\n <a\n className={cx(anchorVariants({ variant }), className)}\n data-component=\"anchor\"\n ref={ref}\n {...(external && {\n rel: 'noopener noreferrer',\n target: '_blank',\n })}\n {...props}\n >\n {children}\n {external && externalIcon !== undefined && (\n <span className=\"gds-icon-child-xs\">{externalIcon}</span>\n )}\n </a>\n )\n },\n)\n\nexport { anchorVariants }\nexport type { AnchorProps }\n","import type { ReactNode } from 'react'\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\nconst colorMap = {\n accent: 'bg-accent',\n danger: 'bg-danger',\n success: 'bg-success',\n} as const\n\ntype BadgeDotProps = React.HTMLAttributes<HTMLDivElement> & {\n children: ReactNode\n color?: 'accent' | 'danger' | 'success'\n show?: boolean\n}\n\nexport const BadgeDot = forwardRef<HTMLDivElement, BadgeDotProps>(\n function BadgeDot({ children, className, color = 'danger', show = true, ...props }, ref) {\n return (\n <div\n className={cx('relative inline-flex', className)}\n data-component=\"badge-dot\"\n ref={ref}\n {...props}\n >\n {children}\n {show && (\n <span\n className={cx('absolute -right-0.5 -top-0.5 h-1.5 w-1.5 rounded-full', colorMap[color])}\n />\n )}\n </div>\n )\n },\n)\n\nexport type { BadgeDotProps }\n","// container — responsive max-width wrapper with size variants\nimport { cva } from 'class-variance-authority'\nimport type { ReactNode } from 'react'\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\nimport type { VariantProps } from '../utils/types'\n\nconst containerVariants = cva('mx-auto w-full px-4', {\n defaultVariants: { size: 'default' },\n variants: {\n size: {\n default: 'max-w-screen-md',\n full: 'max-w-full',\n lg: 'max-w-screen-lg',\n sm: 'max-w-screen-sm',\n xl: 'max-w-screen-xl',\n },\n },\n})\n\ntype ContainerProps = React.HTMLAttributes<HTMLDivElement> &\n VariantProps<typeof containerVariants> & {\n children: ReactNode\n }\n\nexport const Container = forwardRef<HTMLDivElement, ContainerProps>(\n function Container({ children, className, size, ...props }, ref) {\n return (\n <div\n className={cx(containerVariants({ size }), className)}\n data-component=\"container\"\n ref={ref}\n {...props}\n >\n {children}\n </div>\n )\n },\n)\n\nexport { containerVariants }\nexport type { ContainerProps }\n","import { cva } from 'class-variance-authority'\nimport type { ReactNode } from 'react'\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\nimport type { VariantProps } from '../utils/types'\n\nconst dividerVariants = cva('', {\n variants: {\n variant: {\n solid: 'border-solid',\n dashed: 'border-dashed',\n dotted: 'border-dotted',\n },\n },\n defaultVariants: { variant: 'solid' },\n})\n\ntype DividerProps = React.HTMLAttributes<HTMLDivElement> & VariantProps<typeof dividerVariants> & {\n icon?: ReactNode\n label?: string\n orientation?: 'horizontal' | 'vertical'\n}\n\nconst Divider = forwardRef<HTMLDivElement, DividerProps>(\n function Divider({ className, icon, label, orientation = 'horizontal', variant = 'solid', ...props }, ref) {\n const variantCls = dividerVariants({ variant })\n\n if (orientation === 'vertical') {\n return (\n <div\n className={cx('inline-flex h-full flex-col items-center', (icon !== undefined || label !== undefined) && 'gds-gap-sm', className)}\n data-component=\"divider\"\n ref={ref}\n {...props}\n >\n {icon !== undefined || label !== undefined ? (\n <>\n <div className={cx('flex-1 border-l border-border', variantCls)} />\n {icon !== undefined && <span className=\"shrink-0 text-fg-muted/50 gds-icon-child-sm\">{icon}</span>}\n {label !== undefined && <span className=\"shrink-0 text-fg-muted/50 gds-text-caption\">{label}</span>}\n <div className={cx('flex-1 border-l border-border', variantCls)} />\n </>\n ) : (\n <div className={cx('h-full border-l border-border', variantCls)} />\n )}\n </div>\n )\n }\n\n if (icon !== undefined || label !== undefined) {\n return (\n <div\n className={cx('flex items-center gds-gap-sm', className)}\n data-component=\"divider\"\n ref={ref}\n {...props}\n >\n <div className={cx('flex-1 border-t border-border', variantCls)} />\n {icon !== undefined && <span className=\"shrink-0 text-fg-muted/50 gds-icon-child-sm\">{icon}</span>}\n {label !== undefined && <span className=\"shrink-0 text-fg-muted/50 gds-text-caption select-none\">{label}</span>}\n <div className={cx('flex-1 border-t border-border', variantCls)} />\n </div>\n )\n }\n\n return (\n <div\n className={cx('h-px w-full', variant === 'solid' ? 'bg-border/50' : cx('border-t border-border', variantCls), className)}\n data-component=\"divider\"\n ref={ref}\n {...props}\n />\n )\n },\n)\n\nexport { Divider, dividerVariants }\nexport type { DividerProps }\n","import { cva } from 'class-variance-authority'\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\nimport type { VariantProps } from '../utils/types'\n\nconst dotVariants = cva('inline-block shrink-0 gds-radius-badge', {\n defaultVariants: {\n color: 'accent',\n size: 'default',\n },\n variants: {\n color: {\n accent: 'bg-accent',\n danger: 'bg-danger',\n muted: 'bg-fg-muted/30',\n success: 'bg-success',\n warning: 'bg-warning',\n },\n size: {\n default: 'h-2 w-2',\n lg: 'h-3 w-3',\n sm: 'h-1.5 w-1.5',\n },\n },\n})\n\ntype DotProps = React.HTMLAttributes<HTMLSpanElement> &\n VariantProps<typeof dotVariants> & {\n label?: string\n pulse?: boolean\n }\n\nexport const Dot = forwardRef<HTMLSpanElement, DotProps>(\n function Dot({ className, color, label, pulse = false, size, ...props }, ref) {\n return (\n <span\n className={cx('relative inline-flex items-center', label !== undefined && 'gds-gap-sm', className)}\n data-component=\"dot\"\n ref={ref}\n {...props}\n >\n <span className={dotVariants({ color, size })} />\n {pulse && (\n <span\n className={cx(\n 'absolute inset-0 animate-ping gds-radius-badge opacity-40',\n dotVariants({ color, size }),\n )}\n />\n )}\n {label !== undefined && (\n <span className=\"gds-text-label text-fg-muted\">{label}</span>\n )}\n </span>\n )\n },\n)\n\nexport { dotVariants }\nexport type { DotProps }\n","import type { CSSProperties, ReactNode } from 'react'\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype FocusRingProps = {\n children: ReactNode\n color?: string\n width?: number\n offset?: number\n className?: string\n}\n\nconst FocusRing = forwardRef<HTMLSpanElement, FocusRingProps>(function FocusRing(\n { children, color = 'var(--gds-accent)', width = 2, offset = 2, className },\n ref,\n) {\n const style: CSSProperties = {\n '--focus-ring-color': color,\n '--focus-ring-width': `${width}px`,\n '--focus-ring-offset': `${offset}px`,\n } as CSSProperties\n\n return (\n <span\n ref={ref}\n className={cx(\n 'relative inline-flex [&:focus-within]:outline [&:focus-within]:outline-[length:var(--focus-ring-width)] [&:focus-within]:outline-[color:var(--focus-ring-color)] [&:focus-within]:outline-offset-[var(--focus-ring-offset)]',\n className,\n )}\n data-component=\"focus-ring\"\n style={style}\n >\n {children}\n </span>\n )\n})\n\nexport { FocusRing }\nexport type { FocusRingProps }\n","// glow-effect — container that adds a colored glow/aura behind its content via box-shadow\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype GlowIntensity = 'sm' | 'default' | 'lg'\n\ntype IntensityConfig = {\n blur: number\n opacity: number\n spread: number\n}\n\nconst intensityMap: Record<GlowIntensity, IntensityConfig> = {\n sm: { blur: 20, opacity: 15, spread: 4 },\n default: { blur: 32, opacity: 18, spread: 8 },\n lg: { blur: 48, opacity: 25, spread: 12 },\n}\n\nfunction buildShadow(color: string, config: IntensityConfig): string {\n const outer = `0 0 ${config.blur}px ${config.spread}px color-mix(in srgb, ${color} ${config.opacity}%, transparent)`\n const innerBlur = Math.round(config.blur * 0.4)\n const innerSpread = Math.round(config.spread * 0.5)\n const innerOpacity = Math.round(config.opacity * 1.5)\n const inner = `0 0 ${innerBlur}px ${innerSpread}px color-mix(in srgb, ${color} ${innerOpacity}%, transparent)`\n return `${outer}, ${inner}`\n}\n\nexport type GlowEffectProps = {\n children: React.ReactNode\n className?: string\n color?: string\n intensity?: GlowIntensity\n radius?: number\n}\n\nexport const GlowEffect = forwardRef<HTMLDivElement, GlowEffectProps>(\n function GlowEffect(\n { children, className, color = 'var(--gds-accent)', intensity = 'default', radius },\n ref,\n ) {\n const config = intensityMap[intensity]\n return (\n <div\n ref={ref}\n data-component=\"glow-effect\"\n className={cx('relative', className)}\n style={{\n borderRadius: radius !== undefined ? `${radius}px` : undefined,\n boxShadow: buildShadow(color, config),\n }}\n >\n {children}\n </div>\n )\n },\n)\n","// gradient-border — container with a gradient border via background-clip trick\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\nexport type GradientBorderProps = {\n children: React.ReactNode\n gradient?: string\n width?: number\n radius?: number\n className?: string\n}\n\nexport const GradientBorder = forwardRef<HTMLDivElement, GradientBorderProps>(\n function GradientBorder(\n {\n children,\n gradient = 'linear-gradient(135deg, var(--gds-accent), var(--gds-success))',\n width = 1,\n radius = 12,\n className,\n },\n ref,\n ) {\n const innerRadius = Math.max(0, radius - width)\n\n return (\n <div\n ref={ref}\n data-component=\"gradient-border\"\n className={cx(className)}\n style={{ background: gradient, padding: width, borderRadius: radius }}\n >\n <div\n className=\"bg-bg\"\n style={{ borderRadius: innerRadius }}\n >\n {children}\n </div>\n </div>\n )\n },\n)\n","// loading — loading indicator variants (dots, bars, pulse, ring, wave)\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype LoadingSize = 'default' | 'lg' | 'sm'\n\ntype LoadingProps = {\n className?: string\n size?: LoadingSize\n}\n\nconst sizeClasses: Record<LoadingSize, { container: string; dot: string }> = {\n default: { container: 'gap-1.5', dot: 'h-2 w-2' },\n lg: { container: 'gap-2', dot: 'h-3 w-3' },\n sm: { container: 'gap-1', dot: 'h-1.5 w-1.5' },\n}\n\nconst barSizeClasses: Record<LoadingSize, { bar: string; container: string }> = {\n default: { bar: 'w-1 h-4', container: 'gap-1 h-4' },\n lg: { bar: 'w-1.5 h-6', container: 'gap-1.5 h-6' },\n sm: { bar: 'w-0.5 h-3', container: 'gap-0.5 h-3' },\n}\n\nconst pulseSizeClasses: Record<LoadingSize, string> = {\n default: 'h-4 w-4',\n lg: 'h-6 w-6',\n sm: 'h-3 w-3',\n}\n\nconst ringSizeClasses: Record<LoadingSize, string> = {\n default: 'h-4 w-4 border-2',\n lg: 'h-6 w-6 border-[3px]',\n sm: 'h-3 w-3 border-[1.5px]',\n}\n\nexport const LoadingDots = forwardRef<HTMLDivElement, LoadingProps>(\n function LoadingDots({ className, size = 'default' }, ref) {\n const s = sizeClasses[size]\n return (\n <div\n className={cx('inline-flex items-center', s.container, className)}\n data-component=\"loading-dots\"\n ref={ref}\n role=\"status\"\n >\n {[0, 1, 2].map((i) => (\n <span\n className={cx('rounded-full bg-accent', s.dot)}\n key={i}\n style={{\n animation: 'loading-dots 1.4s infinite ease-in-out both',\n animationDelay: `${i * 0.16}s`,\n }}\n />\n ))}\n </div>\n )\n },\n)\n\nexport const LoadingBars = forwardRef<HTMLDivElement, LoadingProps>(\n function LoadingBars({ className, size = 'default' }, ref) {\n const s = barSizeClasses[size]\n return (\n <div\n className={cx('inline-flex items-center', s.container, className)}\n data-component=\"loading-bars\"\n ref={ref}\n role=\"status\"\n >\n {[0, 1, 2, 3, 4].map((i) => (\n <span\n className={cx('rounded-sm bg-accent', s.bar)}\n key={i}\n style={{\n animation: 'loading-bars 1.2s infinite ease-in-out',\n animationDelay: `${i * 0.1}s`,\n }}\n />\n ))}\n </div>\n )\n },\n)\n\nexport const LoadingPulse = forwardRef<HTMLDivElement, LoadingProps>(\n function LoadingPulse({ className, size = 'default' }, ref) {\n return (\n <div\n className={cx('inline-flex items-center justify-center', className)}\n data-component=\"loading-pulse\"\n ref={ref}\n role=\"status\"\n >\n <span\n className={cx('rounded-full bg-accent', pulseSizeClasses[size])}\n style={{ animation: 'loading-pulse 2s infinite ease-in-out' }}\n />\n </div>\n )\n },\n)\n\nexport const LoadingRing = forwardRef<HTMLDivElement, LoadingProps>(\n function LoadingRing({ className, size = 'default' }, ref) {\n return (\n <div\n className={cx('inline-flex items-center justify-center', className)}\n data-component=\"loading-ring\"\n ref={ref}\n role=\"status\"\n >\n <span\n className={cx(\n 'animate-spin rounded-full border-accent border-t-transparent',\n ringSizeClasses[size],\n )}\n />\n </div>\n )\n },\n)\n\nexport const LoadingWave = forwardRef<HTMLDivElement, LoadingProps>(\n function LoadingWave({ className, size = 'default' }, ref) {\n const s = sizeClasses[size]\n return (\n <div\n className={cx('inline-flex items-end', s.container, className)}\n data-component=\"loading-wave\"\n ref={ref}\n role=\"status\"\n >\n {[0, 1, 2, 3, 4].map((i) => (\n <span\n className={cx('rounded-full bg-fg-muted', s.dot)}\n key={i}\n style={{\n animation: 'loading-wave 1.2s infinite ease-in-out',\n animationDelay: `${i * 0.1}s`,\n }}\n />\n ))}\n </div>\n )\n },\n)\n\nexport type { LoadingProps, LoadingSize }\n","// number-stepper — increment/decrement buttons for number-input\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype NumberStepperProps = {\n direction: 'decrement' | 'increment'\n disabled?: boolean\n onClick: () => void\n}\n\nconst btnBase =\n 'flex items-center justify-center select-none px-2 text-fg-muted hover:text-fg hover:bg-bg-tertiary transition-colors disabled:cursor-not-allowed disabled:opacity-50'\n\nconst NumberStepper = forwardRef<HTMLButtonElement, NumberStepperProps>(function NumberStepper(\n { direction, disabled, onClick },\n ref,\n) {\n const isDecrement = direction === 'decrement'\n return (\n <button\n ref={ref}\n aria-label={direction}\n className={cx(\n btnBase,\n isDecrement ? 'rounded-l-[inherit] border-r border-border' : 'rounded-r-[inherit] border-l border-border',\n )}\n disabled={disabled}\n onClick={onClick}\n tabIndex={-1}\n type=\"button\"\n >\n {isDecrement ? '-' : '+'}\n </button>\n )\n})\n\nexport { NumberStepper }\nexport type { NumberStepperProps }\n","import { cva } from 'class-variance-authority'\nimport { forwardRef, useCallback } from 'react'\n\nimport { cx } from '../utils/cx'\nimport { glassClass } from '../utils/glass'\nimport type { VariantProps } from '../utils/types'\nimport { NumberStepper } from './number-stepper'\n\nconst numberInputVariants = cva(\n 'flex items-center gds-radius-input border bg-bg text-fg transition-colors ' +\n '[&:has(input:focus-visible)]:ring-2 [&:has(input:focus-visible)]:ring-accent [&:has(input:focus-visible)]:ring-offset-1 [&:has(input:focus-visible)]:ring-offset-bg',\n {\n compoundVariants: [\n {\n error: true,\n className:\n '[&:has(input:focus-visible)]:ring-danger',\n },\n ],\n defaultVariants: {\n error: false,\n inputSize: 'default',\n },\n variants: {\n error: {\n false: 'border-border hover:border-border-strong',\n true: 'border-danger',\n },\n inputSize: {\n default: 'gds-h gds-text-body',\n sm: 'gds-h-sm gds-text-label',\n },\n },\n },\n)\n\ntype NumberInputProps = VariantProps<typeof numberInputVariants> & {\n className?: string\n disabled?: boolean\n glass?: boolean\n max?: number\n min?: number\n onChange: (value: number | null) => void\n placeholder?: string\n prefix?: string\n step?: number\n suffix?: string\n value: number | null\n}\n\nfunction clamp(val: number, min?: number, max?: number): number {\n let result = val\n if (min !== undefined && result < min) {\n result = min\n }\n if (max !== undefined && result > max) {\n result = max\n }\n return result\n}\n\nconst NumberInput = forwardRef<HTMLInputElement, NumberInputProps>(\n function NumberInput(\n { className, disabled, error, glass, inputSize, max, min, onChange, placeholder, prefix, step = 1, suffix, value },\n ref,\n ) {\n const handleDecrement = useCallback(() => {\n const base = value ?? 0\n onChange(clamp(base - step, min, max))\n }, [value, step, min, max, onChange])\n\n const handleIncrement = useCallback(() => {\n const base = value ?? 0\n onChange(clamp(base + step, min, max))\n }, [value, step, min, max, onChange])\n\n const handleChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const raw = e.target.value\n if (raw === '') {\n onChange(null)\n return\n }\n const parsed = Number(raw)\n if (Number.isNaN(parsed)) {\n return\n }\n onChange(clamp(parsed, min, max))\n },\n [min, max, onChange],\n )\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'ArrowUp') {\n e.preventDefault()\n handleIncrement()\n }\n if (e.key === 'ArrowDown') {\n e.preventDefault()\n handleDecrement()\n }\n },\n [handleIncrement, handleDecrement],\n )\n\n return (\n <div\n className={cx(\n numberInputVariants({ error, inputSize }),\n glassClass(glass),\n glass === true && 'border-white/10 bg-bg/60',\n disabled === true && 'cursor-not-allowed opacity-50',\n className,\n )}\n data-component=\"number-input\"\n >\n <NumberStepper direction=\"decrement\" disabled={disabled} onClick={handleDecrement} />\n {prefix !== undefined && <span className=\"shrink-0 select-none pl-1 text-fg-muted/50\">{prefix}</span>}\n <input\n className={cx(\n 'min-w-0 flex-1 bg-transparent text-center outline-none placeholder:text-fg-muted/50',\n '[appearance:textfield] [&::-webkit-inner-spin-button]:appearance-none [&::-webkit-outer-spin-button]:appearance-none',\n )}\n disabled={disabled}\n onChange={handleChange}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n ref={ref}\n type=\"number\"\n value={value ?? ''}\n />\n {suffix !== undefined && <span className=\"shrink-0 select-none pr-1 text-fg-muted/50\">{suffix}</span>}\n <NumberStepper direction=\"increment\" disabled={disabled} onClick={handleIncrement} />\n </div>\n )\n },\n)\n\nexport { NumberInput, numberInputVariants }\nexport type { NumberInputProps }\n","import { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\nimport { glassClass } from '../utils/glass'\nimport { renderPortal } from '../utils/portal'\n\ntype ScreenOverlayProps = {\n visible: boolean\n glass?: boolean\n onClick?: () => void\n className?: string\n}\n\nconst ScreenOverlayInner = forwardRef<HTMLDivElement, ScreenOverlayProps>(\n function ScreenOverlayInner({ visible, glass, onClick, className }, ref) {\n if (!visible) return null\n\n return (\n <div\n className={cx(\n 'fixed inset-0 z-40',\n glass === true ? glassClass(true) : 'bg-black/50',\n className,\n )}\n data-component=\"screen-overlay\"\n onClick={onClick}\n ref={ref}\n />\n )\n },\n)\n\nexport const ScreenOverlay = forwardRef<HTMLDivElement, ScreenOverlayProps>(\n function ScreenOverlay(props, ref) {\n return renderPortal(<ScreenOverlayInner ref={ref} {...props} />)\n },\n)\n\nexport type { ScreenOverlayProps }\n","import type { ReactNode } from 'react'\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype ScrollAreaProps = React.HTMLAttributes<HTMLDivElement> & {\n children: ReactNode\n maxHeight?: number | string\n orientation?: 'both' | 'horizontal' | 'vertical'\n}\n\nexport const ScrollArea = forwardRef<HTMLDivElement, ScrollAreaProps>(\n function ScrollArea(\n { children, className, maxHeight, orientation = 'vertical', style, ...props },\n ref,\n ) {\n return (\n <div\n className={cx(\n orientation === 'vertical' && 'overflow-x-hidden overflow-y-auto',\n orientation === 'horizontal' && 'overflow-x-auto overflow-y-hidden',\n orientation === 'both' && 'overflow-auto',\n className,\n )}\n data-component=\"scroll-area\"\n ref={ref}\n style={{\n ...style,\n maxHeight:\n maxHeight !== undefined\n ? typeof maxHeight === 'number'\n ? `${maxHeight}px`\n : maxHeight\n : undefined,\n }}\n {...props}\n >\n {children}\n </div>\n )\n },\n)\n\nexport type { ScrollAreaProps }\n","// shimmer — skeleton shimmer placeholder effect\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype ShimmerProps = React.HTMLAttributes<HTMLDivElement> & {\n height?: string\n rounded?: boolean\n width?: string\n}\n\nexport const Shimmer = forwardRef<HTMLDivElement, ShimmerProps>(\n function Shimmer({ className, height = '20px', rounded = false, width = '100%', ...props }, ref) {\n return (\n <div\n className={cx(\n 'relative overflow-hidden bg-fg-muted/10',\n rounded ? 'rounded-full' : 'rounded-md',\n className,\n )}\n data-component=\"shimmer\"\n ref={ref}\n style={{ width, height }}\n {...props}\n >\n <div className=\"absolute inset-0 animate-[shimmer_1.5s_ease-in-out_infinite] bg-gradient-to-r from-transparent via-fg-muted/5 to-transparent\" />\n </div>\n )\n },\n)\n\nexport type { ShimmerProps }\n","import { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype SkipNavProps = {\n targetId?: string\n label?: string\n className?: string\n}\n\nconst SkipNav = forwardRef<HTMLAnchorElement, SkipNavProps>(function SkipNav(\n { targetId = 'main-content', label = 'Skip to content', className },\n ref,\n) {\n return (\n <a\n ref={ref}\n className={cx(\n 'absolute left-2 top-2 z-50 -translate-y-full rounded bg-accent px-3 py-2 text-sm font-medium text-accent-fg transition-transform focus:translate-y-0 focus:outline-none',\n className,\n )}\n data-component=\"skip-nav\"\n href={`#${targetId}`}\n >\n {label}\n </a>\n )\n})\n\nexport { SkipNav }\nexport type { SkipNavProps }\n","// slider — native range input with value display\nimport { forwardRef } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\n\ntype SliderProps = Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange'> & {\n disabled?: boolean\n max?: number\n min?: number\n onChange?: (value: number) => void\n step?: number\n value?: number\n}\n\nexport const Slider = forwardRef<HTMLInputElement, SliderProps>(\n function Slider(\n { className, disabled = false, max = 100, min = 0, onChange, step = 1, value = 0, ...props },\n ref,\n ) {\n return (\n <div className={cx('flex items-center gap-3', className)} data-component=\"slider\" {...props}>\n <input\n className={cx(\n 'h-1.5 w-full cursor-pointer appearance-none rounded-full bg-bg-tertiary accent-accent',\n disabled && 'cursor-not-allowed opacity-50',\n focusCls,\n )}\n disabled={disabled}\n max={max}\n min={min}\n onChange={(e) => onChange?.(Number(e.target.value))}\n ref={ref}\n step={step}\n type=\"range\"\n value={value}\n />\n <span className=\"w-8 shrink-0 text-right font-mono text-xs text-fg-muted tabular-nums\">\n {value}\n </span>\n </div>\n )\n },\n)\n\nexport type { SliderProps }\n","// truncate — text truncation with ellipsis, single or multi-line clamp\nimport type { ReactNode } from 'react'\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\nexport type TruncateProps = {\n children: ReactNode\n lines?: number\n expanded?: boolean\n onToggle?: () => void\n className?: string\n}\n\nexport const Truncate = forwardRef<HTMLDivElement, TruncateProps>(\n function Truncate(\n { children, lines = 1, expanded = false, onToggle, className },\n ref,\n ) {\n const shouldClamp = !expanded\n const isSingleLine = lines === 1\n const isInteractive = onToggle !== undefined\n\n const clampStyle = !isSingleLine && shouldClamp\n ? {\n display: '-webkit-box' as const,\n WebkitLineClamp: lines,\n WebkitBoxOrient: 'vertical' as const,\n overflow: 'hidden' as const,\n }\n : undefined\n\n return (\n <div\n ref={ref}\n className={cx(\n isSingleLine && shouldClamp && 'truncate',\n isInteractive && 'cursor-pointer',\n className,\n )}\n style={clampStyle}\n onClick={isInteractive ? onToggle : undefined}\n data-component=\"truncate\"\n data-expanded={expanded ? 'true' : undefined}\n role={isInteractive ? 'button' : undefined}\n tabIndex={isInteractive ? 0 : undefined}\n >\n {children}\n </div>\n )\n },\n)\n","import type { ReactNode } from 'react'\nimport { forwardRef } from 'react'\n\nimport { srOnly } from '../utils/a11y'\nimport { cx } from '../utils/cx'\n\ntype VisuallyHiddenProps = {\n as?: 'div' | 'span'\n children: ReactNode\n className?: string\n}\n\nconst VisuallyHidden = forwardRef<HTMLElement, VisuallyHiddenProps>(function VisuallyHidden(\n { as: Tag = 'span', children, className },\n ref,\n) {\n return (\n <Tag ref={ref as never} className={cx(srOnly, className)} data-component=\"visually-hidden\">\n {children}\n </Tag>\n )\n})\n\nexport { VisuallyHidden }\nexport type { VisuallyHiddenProps }\n"],"mappings":"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"}
|