canny-ui 1.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/LICENSE +21 -0
- package/README.md +53 -0
- package/dist/canny-ui.css +887 -0
- package/dist/canny-ui.min.css +1 -0
- package/dist/table-resize.js +104 -0
- package/package.json +64 -0
- package/src/_utilities.scss +215 -0
- package/src/base/_reset.scss +16 -0
- package/src/base/_typography.scss +93 -0
- package/src/canny-ui.scss +21 -0
- package/src/components/_alerts.scss +79 -0
- package/src/components/_avatar.scss +92 -0
- package/src/components/_buttons.scss +417 -0
- package/src/components/_cards.scss +66 -0
- package/src/components/_fields.scss +440 -0
- package/src/components/_forms.scss +158 -0
- package/src/components/_inputs.scss +90 -0
- package/src/components/_navbar.scss +151 -0
- package/src/components/_progress.scss +70 -0
- package/src/components/_scrollbar.scss +159 -0
- package/src/components/_sidebar.scss +132 -0
- package/src/components/_skeleton.scss +72 -0
- package/src/components/_table.scss +132 -0
- package/src/components/_text.scss +132 -0
- package/src/components/_tooltip.scss +72 -0
- package/src/scripts/table-resize.js +104 -0
- package/src/tokens/_primitives.scss +73 -0
- package/src/tokens/_semantic.scss +199 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
@import"https://fonts.googleapis.com/css2?family=Fraunces:ital,opsz,wght@0,9..144,300..900;1,9..144,300..900&family=Geist+Mono:wght@300..700&family=Geist:wght@300..700&display=swap";:root{--bg-base: #fafafa;--bg-surface-low: #f4f4f5;--bg-surface-lowest: #ffffff;--bg-surface-edge: #e4e4e7;--text-primary: #09090b;--text-secondary: #3f3f46;--text-muted: #71717a;--text-disabled: #a1a1aa;--text-on-solid: #ffffff;--text-accent: #4f46e5;--color-primary: #4f46e5;--color-primary-hover: #4338ca;--color-primary-active:#3730a3;--color-primary-soft: #eef2ff;--color-primary-on: #ffffff;--color-neutral: #18181b;--color-neutral-hover: #27272a;--color-neutral-soft: #f4f4f5;--color-neutral-on: #ffffff;--color-danger: #dc2626;--color-danger-hover: #b91c1c;--color-danger-soft: #fef2f2;--color-danger-on: #ffffff;--color-warning: #d97706;--color-warning-hover: #b45309;--color-warning-soft: #fffbeb;--color-warning-on: #ffffff;--color-success: #059669;--color-success-hover: #047857;--color-success-soft: #ecfdf5;--color-success-on: #ffffff;--color-info: #0284c7;--color-info-hover: #0369a1;--color-info-soft: #f0f9ff;--color-info-on: #ffffff;--border-color: #e4e4e7;--border-color-strong: #d4d4d8;--border-focus: #6366f1;--ring-color: rgba(79, 70, 229, 0.28);--ring-width: 3px;--shadow-xs: 0 1px 2px 0 rgba(9, 9, 11, 0.05);--shadow-sm: 0 1px 2px 0 rgba(9, 9, 11, 0.06), 0 1px 3px 0 rgba(9, 9, 11, 0.04);--shadow-md: 0 4px 6px -1px rgba(9, 9, 11, 0.07), 0 2px 4px -2px rgba(9, 9, 11, 0.05);--shadow-lg: 0 10px 15px -3px rgba(9, 9, 11, 0.08), 0 4px 6px -4px rgba(9, 9, 11, 0.05);--shadow-card: var(--shadow-sm);--shadow-lift: var(--shadow-lg);--shadow-ambient: 0 0 0 3px var(--ring-color);--ease-standard: cubic-bezier(0.2, 0, 0, 1);--transition-fast: 120ms var(--ease-standard);--transition-base: 180ms var(--ease-standard);--transition-slow: 260ms var(--ease-standard);--radius-xs: 3px;--radius-sm: 5px;--radius-md: 7px;--radius-lg: 10px;--radius-xl: 14px;--radius-full: 9999px;--font-body: 'Geist', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;--font-mono: 'Geist Mono', ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;--font-display: 'Fraunces', Georgia, serif;--hairline-color: #e4e4e7;--hairline-strong: #d4d4d8;--text-xs: 0.75rem;--text-sm: 0.875rem;--text-base: 0.9375rem;--text-lg: 1.0625rem;--text-xl: 1.25rem;--text-2xl: 1.5rem;--text-3xl: 1.875rem;--text-4xl: 2.25rem;--track-tight: -0.015em;--track-normal: 0;--track-wide: 0.04em;--track-wider: 0.08em}@media(prefers-color-scheme: dark){:root{--bg-base: #09090b;--bg-surface-low: #18181b;--bg-surface-lowest: #27272a;--bg-surface-edge: #3f3f46;--text-primary: #fafafa;--text-secondary: #d4d4d8;--text-muted: #a1a1aa;--text-disabled: #52525b;--text-accent: #818cf8;--color-primary: #6366f1;--color-primary-hover: #818cf8;--color-primary-active:#4f46e5;--color-primary-soft: rgba(99, 102, 241, 0.15);--color-neutral: #fafafa;--color-neutral-hover: #ffffff;--color-neutral-soft: #27272a;--color-neutral-on: #09090b;--color-danger-soft: rgba(220, 38, 38, 0.16);--color-warning-soft: rgba(217, 119, 6, 0.16);--color-success-soft: rgba(5, 150, 105, 0.16);--color-info-soft: rgba(2, 132, 199, 0.16);--border-color: #27272a;--border-color-strong: #3f3f46;--border-focus: #818cf8;--ring-color: rgba(99, 102, 241, 0.45);--shadow-xs: 0 1px 2px 0 rgba(0, 0, 0, 0.3);--shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.4), 0 1px 3px 0 rgba(0, 0, 0, 0.3);--shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.5);--shadow-lg: 0 16px 32px -8px rgba(0, 0, 0, 0.6);--hairline-color: #27272a;--hairline-strong: #3f3f46}}.cny-dark{--bg-base: #09090b;--bg-surface-low: #18181b;--bg-surface-lowest: #27272a;--bg-surface-edge: #3f3f46;--text-primary: #fafafa;--text-secondary: #d4d4d8;--text-muted: #a1a1aa;--text-disabled: #52525b;--text-accent: #818cf8;--color-primary: #6366f1;--color-primary-hover: #818cf8;--color-primary-active:#4f46e5;--color-primary-soft: rgba(99, 102, 241, 0.15);--color-neutral: #fafafa;--color-neutral-hover: #ffffff;--color-neutral-soft: #27272a;--color-neutral-on: #09090b;--color-danger-soft: rgba(220, 38, 38, 0.16);--color-warning-soft: rgba(217, 119, 6, 0.16);--color-success-soft: rgba(5, 150, 105, 0.16);--color-info-soft: rgba(2, 132, 199, 0.16);--border-color: #27272a;--border-color-strong: #3f3f46;--border-focus: #818cf8;--ring-color: rgba(99, 102, 241, 0.45);--shadow-xs: 0 1px 2px 0 rgba(0, 0, 0, 0.3);--shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.4), 0 1px 3px 0 rgba(0, 0, 0, 0.3);--shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.5);--shadow-lg: 0 16px 32px -8px rgba(0, 0, 0, 0.6);--hairline-color: #27272a;--hairline-strong: #3f3f46}*,*::before,*::after{box-sizing:border-box}html,body{margin:0;padding:0}body{background:var(--bg-base);color:var(--text-primary)}.cny-app{font-family:var(--font-body);font-size:var(--text-base);line-height:1.55;color:var(--text-primary);font-feature-settings:"ss01","cv11";-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-rendering:optimizeLegibility}.cny-app h1{font-family:var(--font-display);font-size:var(--text-3xl);font-weight:600;letter-spacing:var(--track-tight);line-height:1.15;margin:0 0 20px;color:var(--text-primary)}.cny-app h2{font-family:var(--font-body);font-size:var(--text-2xl);font-weight:600;letter-spacing:var(--track-tight);line-height:1.2;margin:0 0 16px}.cny-app h3{font-family:var(--font-body);font-size:var(--text-xl);font-weight:600;letter-spacing:-0.005em;line-height:1.3;margin:0 0 12px}.cny-app h4{font-family:var(--font-body);font-size:var(--text-lg);font-weight:600;line-height:1.35;margin:0 0 8px}.cny-app p{margin:0 0 16px;max-width:72ch;color:var(--text-secondary)}.cny-app a:not([class]){color:var(--text-accent);text-decoration:underline;text-decoration-thickness:1px;text-underline-offset:.18em;transition:color var(--transition-fast)}.cny-app a:not([class]):hover{color:var(--color-primary-hover)}.cny-app small,.cny-app .cny-meta{font-size:var(--text-xs);color:var(--text-muted)}.cny-app code,.cny-app kbd,.cny-app pre,.cny-app samp{font-family:var(--font-mono);font-size:.92em}.cny-app .cny-tabular{font-variant-numeric:tabular-nums slashed-zero}.cny-display{font-family:var(--font-display);font-weight:400;font-variation-settings:"opsz" 144;letter-spacing:var(--track-tight)}.btn{position:relative;overflow:hidden;isolation:isolate;display:inline-flex;align-items:center;justify-content:center;gap:8px;padding:0 16px;min-height:36px;border:0;border-radius:var(--radius-sm);background:rgba(0,0,0,0);color:var(--text-primary);text-decoration:none;font-family:var(--font-body);font-size:.875rem;font-weight:500;letter-spacing:-0.005em;line-height:1;cursor:pointer;user-select:none;white-space:nowrap;-webkit-tap-highlight-color:rgba(0,0,0,0);transition:background-color var(--transition-fast),border-color var(--transition-fast),box-shadow 180ms var(--ease-standard),color var(--transition-fast)}.btn:disabled,.btn[aria-disabled=true]{opacity:.5;cursor:not-allowed;pointer-events:none}.btn:focus-visible{outline:none;box-shadow:0 0 0 var(--ring-width) var(--ring-color)}.btn .btn-content{position:relative;z-index:1;display:inline-flex;align-items:center;justify-content:center;gap:inherit}.btn .btn-ripple{position:absolute;z-index:0;border-radius:50%;pointer-events:none;transform-origin:center;background:rgba(0,0,0,.18)}.btn.solid .btn-ripple,.btn.secondary .btn-ripple{background:hsla(0,0%,100%,.55)}@media(prefers-reduced-motion: reduce){.btn .btn-ripple{display:none}}.btn.solid{background:var(--color-primary);color:var(--color-primary-on);box-shadow:var(--shadow-xs)}.btn.solid:hover:not(:disabled){background:var(--color-primary-hover);box-shadow:var(--shadow-sm)}.btn.solid:active:not(:disabled){background:var(--color-primary-active);box-shadow:var(--shadow-xs),inset 0 1px 0 0 rgba(0,0,0,.08)}.btn.solid.danger{background:var(--color-danger);color:var(--color-danger-on)}.btn.solid.danger:hover:not(:disabled){background:var(--color-danger-hover)}.btn.solid.warning{background:var(--color-warning);color:var(--color-warning-on)}.btn.solid.warning:hover:not(:disabled){background:var(--color-warning-hover)}.btn.solid.success{background:var(--color-success);color:var(--color-success-on)}.btn.solid.success:hover:not(:disabled){background:var(--color-success-hover)}.btn.solid.info{background:var(--color-info);color:var(--color-info-on)}.btn.solid.info:hover:not(:disabled){background:var(--color-info-hover)}.btn.secondary{background:var(--color-neutral);color:var(--color-neutral-on);box-shadow:var(--shadow-xs)}.btn.secondary:hover:not(:disabled){background:var(--color-neutral-hover);box-shadow:var(--shadow-sm)}.btn.secondary:active:not(:disabled){box-shadow:var(--shadow-xs),inset 0 1px 0 0 rgba(0,0,0,.12)}.btn.outline{background:var(--bg-surface-lowest);color:var(--text-primary);box-shadow:inset 0 0 0 1px var(--border-color),var(--shadow-xs)}.btn.outline:hover:not(:disabled){background:var(--bg-surface-low);box-shadow:inset 0 0 0 1px var(--border-color-strong),var(--shadow-sm)}.btn.outline:active:not(:disabled){box-shadow:inset 0 0 0 1px var(--border-color-strong),inset 0 1px 0 0 rgba(0,0,0,.04)}.btn.outline.danger{color:var(--color-danger)}.btn.outline.warning{color:var(--color-warning)}.btn.outline.success{color:var(--color-success)}.btn.outline.info{color:var(--color-info)}.btn.dashed{background:var(--bg-surface-lowest);color:var(--text-primary);border:1px dashed var(--border-color);transition:background-color var(--transition-fast),border-color var(--transition-fast),color var(--transition-fast),box-shadow 180ms var(--ease-standard)}.btn.dashed:hover:not(:disabled){background:var(--bg-surface-low);border-color:var(--color-primary);color:var(--color-primary)}.btn.dashed:active:not(:disabled){background:var(--bg-surface-edge);border-color:var(--color-primary-active)}.btn.dashed.danger:hover:not(:disabled){border-color:var(--color-danger);color:var(--color-danger)}.btn.dashed.warning:hover:not(:disabled){border-color:var(--color-warning);color:var(--color-warning)}.btn.dashed.success:hover:not(:disabled){border-color:var(--color-success);color:var(--color-success)}.btn.dashed.info:hover:not(:disabled){border-color:var(--color-info);color:var(--color-info)}.btn.ghost{background:rgba(0,0,0,0);color:var(--text-primary)}.btn.ghost:hover:not(:disabled){background:var(--bg-surface-low)}.btn.ghost:active:not(:disabled){background:var(--bg-surface-edge)}.btn.ghost.danger{color:var(--color-danger)}.btn.ghost.danger:hover:not(:disabled){background:var(--color-danger-soft)}.btn.ghost.warning{color:var(--color-warning)}.btn.ghost.warning:hover:not(:disabled){background:var(--color-warning-soft)}.btn.ghost.success{color:var(--color-success)}.btn.ghost.success:hover:not(:disabled){background:var(--color-success-soft)}.btn.ghost.info{color:var(--color-info)}.btn.ghost.info:hover:not(:disabled){background:var(--color-info-soft)}.btn.soft{background:var(--color-primary-soft);color:var(--color-primary)}.btn.soft:hover:not(:disabled){background:var(--bg-surface-edge)}.btn.soft.danger{background:var(--color-danger-soft);color:var(--color-danger)}.btn.soft.warning{background:var(--color-warning-soft);color:var(--color-warning)}.btn.soft.success{background:var(--color-success-soft);color:var(--color-success)}.btn.soft.info{background:var(--color-info-soft);color:var(--color-info)}.btn.link{overflow:visible;background:rgba(0,0,0,0);color:var(--text-accent);padding:0;min-height:auto;border-radius:0;text-decoration:underline;text-decoration-thickness:1px;text-underline-offset:.2em}.btn.link:hover:not(:disabled){color:var(--color-primary-hover)}.btn.link .btn-ripple{display:none}.btn.sm{padding:0 12px;min-height:28px;font-size:.8125rem}.btn.lg{padding:0 20px;min-height:44px;font-size:.9375rem}.btn.icon{padding:0;width:36px}.btn.icon.sm{width:28px}.btn.icon.lg{width:44px}.btn.round{border-radius:999px}.btn.circle{padding:0;width:36px;border-radius:50%}.btn.circle.sm{width:28px}.btn.circle.lg{width:44px}.btn.block{display:flex;width:100%}.btn.loading{pointer-events:none;cursor:default}.btn[aria-pressed=true].ghost,.btn[data-state=on].ghost{background:var(--color-primary-soft);color:var(--color-primary)}.btn[aria-pressed=true].outline,.btn[data-state=on].outline{background:var(--color-primary-soft);color:var(--color-primary);box-shadow:inset 0 0 0 1px var(--color-primary),var(--shadow-xs)}.btn[aria-pressed=true].soft,.btn[data-state=on].soft{background:var(--color-primary);color:var(--color-primary-on)}.btn[aria-pressed=true].dashed,.btn[data-state=on].dashed{background:var(--color-primary-soft);color:var(--color-primary);border-color:var(--color-primary)}.btn.fab{width:56px;min-height:56px;padding:0;border-radius:50%;box-shadow:var(--shadow-lg);font-weight:600}.btn.fab:hover:not(:disabled){box-shadow:0 12px 20px -6px rgba(9,9,11,.16),0 4px 8px -2px rgba(9,9,11,.08)}.btn.fab:active:not(:disabled){box-shadow:var(--shadow-md),inset 0 1px 0 0 rgba(0,0,0,.08)}.btn.fab.sm{width:40px;min-height:40px;font-size:.875rem}.btn.fab.lg{width:64px;min-height:64px;font-size:1rem}.btn.fab.extended{width:auto;border-radius:999px;padding:0 20px;gap:8px;min-width:80px}.btn.fab.extended.sm{padding:0 16px;min-width:64px}.btn.fab.extended.lg{padding:0 24px;min-width:96px}.btn.fab.fixed-bottom-right{position:fixed;bottom:24px;right:24px;z-index:50}.btn.fab.fixed-bottom-left{position:fixed;bottom:24px;left:24px;z-index:50}.btn.fab.fixed-top-right{position:fixed;top:24px;right:24px;z-index:50}.btn.fab.fixed-top-left{position:fixed;top:24px;left:24px;z-index:50}.btn-group{display:inline-flex;vertical-align:middle;isolation:isolate}.btn-group>.btn{border-radius:0;position:relative}.btn-group>.btn:not(:first-child){margin-left:-1px}.btn-group>.btn:first-child{border-top-left-radius:var(--radius-sm);border-bottom-left-radius:var(--radius-sm)}.btn-group>.btn:last-child{border-top-right-radius:var(--radius-sm);border-bottom-right-radius:var(--radius-sm)}.btn-group>.btn:hover:not(:disabled),.btn-group>.btn:focus-visible,.btn-group>.btn[aria-pressed=true],.btn-group>.btn[data-state=on]{z-index:1}.btn-group.vertical{flex-direction:column}.btn-group.vertical>.btn:not(:first-child){margin-left:0;margin-top:-1px}.btn-group.vertical>.btn:first-child{border-radius:var(--radius-sm) var(--radius-sm) 0 0}.btn-group.vertical>.btn:last-child{border-radius:0 0 var(--radius-sm) var(--radius-sm)}.btn-group.spaced{gap:4px}.btn-group.spaced>.btn{border-radius:var(--radius-sm)}.btn-group.spaced>.btn:not(:first-child){margin-left:0}.btn-group.spaced>.btn:not(:last-child){margin-right:0}.btn-group.round>.btn:first-child{border-top-left-radius:999px;border-bottom-left-radius:999px;padding-left:20px}.btn-group.round>.btn:last-child{border-top-right-radius:999px;border-bottom-right-radius:999px;padding-right:20px}.btn-spinner{display:inline-block;width:1em;height:1em;border:2px solid currentColor;border-right-color:rgba(0,0,0,0);border-radius:50%;animation:cny-btn-spin 700ms linear infinite;flex-shrink:0;vertical-align:-0.125em}@keyframes cny-btn-spin{to{transform:rotate(360deg)}}@media(prefers-reduced-motion: reduce){.btn-spinner{animation-duration:1400ms}}@media(forced-colors: active){.btn{border:1px solid ButtonBorder;forced-color-adjust:none;color:ButtonText;background:ButtonFace}.btn:focus-visible{outline:2px solid SelectedItem;outline-offset:2px;box-shadow:none}.btn.solid,.btn.secondary{background:SelectedItem;color:SelectedItemText;border-color:SelectedItem}.btn[aria-pressed=true],.btn[data-state=on]{background:SelectedItem;color:SelectedItemText}.btn:disabled,.btn[aria-disabled=true]{color:GrayText;border-color:GrayText}.btn .btn-ripple{display:none}.btn-spinner{border-color:ButtonText;border-right-color:rgba(0,0,0,0)}}.input{display:block;width:100%;min-height:36px;padding:0 12px;background:var(--bg-surface-lowest);color:var(--text-primary);border:1px solid var(--border-color);border-radius:var(--radius-sm);outline:none;font-family:var(--font-body);font-size:.875rem;line-height:1.4;transition:border-color var(--transition-fast),box-shadow var(--transition-fast)}.input::placeholder{color:var(--text-muted)}.input:hover:not(:disabled):not(:focus){border-color:var(--border-color-strong)}.input:focus{border-color:var(--border-focus);box-shadow:none}.input:disabled{background:var(--bg-surface-low);color:var(--text-disabled);cursor:not-allowed}.input.sm{min-height:28px;font-size:.8125rem;padding:0 8px}.input.lg{min-height:44px;font-size:.9375rem;padding:0 16px}.input.danger{border-color:var(--color-danger)}.input.danger:focus{border-color:var(--color-danger);box-shadow:none}.input.warning{border-color:var(--color-warning)}.input.warning:focus{border-color:var(--color-warning);box-shadow:none}.input.success{border-color:var(--color-success)}.input.success:focus{border-color:var(--color-success);box-shadow:none}textarea.input{min-height:88px;padding:8px 12px;line-height:1.55;resize:vertical}.input-label{display:block;font-family:var(--font-body);font-size:.8125rem;font-weight:500;color:var(--text-secondary);margin-bottom:8px}.input-hint{display:block;font-size:.75rem;color:var(--text-muted);margin-top:8px}.input-hint.danger{color:var(--color-danger)}.input-hint.warning{color:var(--color-warning)}.input-hint.success{color:var(--color-success)}.card{position:relative;background:var(--bg-surface-lowest);border-radius:var(--radius-lg);box-shadow:var(--shadow-card);padding:24px;transition:box-shadow var(--transition-fast),border-color var(--transition-fast)}.card.interactive{cursor:pointer}.card.interactive:hover{box-shadow:var(--shadow-lift)}.card.danger,.card.warning,.card.success,.card.info{overflow:hidden}.card.danger::before,.card.warning::before,.card.success::before,.card.info::before{content:"";position:absolute;left:0;top:24px;bottom:24px;width:2px;border-radius:1px}.card.danger::before{background:var(--color-danger)}.card.warning::before{background:var(--color-warning)}.card.success::before{background:var(--color-success)}.card.info::before{background:var(--color-info)}.card.flush{background:rgba(0,0,0,0);box-shadow:none;border-top:1px solid var(--hairline-color);border-radius:0;padding:20px 0}.card-header{display:flex;align-items:baseline;justify-content:space-between;gap:16px;margin-bottom:16px}.card-footer{margin-top:20px;padding-top:16px;border-top:1px solid var(--hairline-color);display:flex;align-items:center;justify-content:space-between;gap:12px}.alert{position:relative;display:flex;align-items:flex-start;gap:12px;padding:12px 16px;background:var(--bg-surface-lowest);color:var(--text-primary);border:1px solid var(--border-color);border-left-width:3px;border-radius:var(--radius-md);font-family:var(--font-body);font-size:.875rem;line-height:1.5}.alert-title{font-weight:600;line-height:1.3;margin:0 0 2px}.alert-body{color:var(--text-secondary);margin:0}.alert-close{margin-left:auto;background:rgba(0,0,0,0);border:0;color:var(--text-muted);cursor:pointer;padding:2px;border-radius:var(--radius-xs);line-height:1;font-size:1rem}.alert-close:hover{color:var(--text-primary);background:var(--bg-surface-low)}.alert.danger{background:var(--color-danger-soft);border-color:var(--color-danger)}.alert.danger .alert-title{color:var(--color-danger)}.alert.warning{background:var(--color-warning-soft);border-color:var(--color-warning)}.alert.warning .alert-title{color:var(--color-warning)}.alert.success{background:var(--color-success-soft);border-color:var(--color-success)}.alert.success .alert-title{color:var(--color-success)}.alert.info{background:var(--color-info-soft);border-color:var(--color-info)}.alert.info .alert-title{color:var(--color-info)}.alert.solid{border:0;background:var(--color-neutral);color:var(--color-neutral-on)}.alert.solid .alert-body{color:var(--color-neutral-on);opacity:.8}.alert.solid .alert-close{color:var(--color-neutral-on);opacity:.7}.alert.solid .alert-close:hover{opacity:1;background:hsla(0,0%,100%,.1)}.alert.solid.danger{background:var(--color-danger);color:var(--color-danger-on)}.alert.solid.warning{background:var(--color-warning);color:var(--color-warning-on)}.alert.solid.success{background:var(--color-success);color:var(--color-success-on)}.alert.solid.info{background:var(--color-info);color:var(--color-info-on)}.checkbox,.radio{appearance:none;-webkit-appearance:none;display:inline-block;width:16px;height:16px;margin:0;padding:0;background:var(--bg-surface-lowest);border:1px solid var(--border-color-strong);cursor:pointer;vertical-align:middle;transition:background-color var(--transition-fast),border-color var(--transition-fast),box-shadow var(--transition-fast)}.checkbox:hover:not(:disabled),.radio:hover:not(:disabled){border-color:var(--color-primary)}.checkbox:focus-visible,.radio:focus-visible{outline:none;box-shadow:0 0 0 var(--ring-width) var(--ring-color)}.checkbox:disabled,.radio:disabled{opacity:.5;cursor:not-allowed}.checkbox{border-radius:var(--radius-xs)}.checkbox:checked{background-color:var(--color-primary);border-color:var(--color-primary);background-image:url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none'><path d='M3.5 8.5L6.5 11.5L12.5 5' stroke='white' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'/></svg>");background-repeat:no-repeat;background-position:center}.checkbox:indeterminate{background-color:var(--color-primary);border-color:var(--color-primary);background-image:url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'><rect x='3' y='7' width='10' height='2' fill='white' rx='1'/></svg>");background-repeat:no-repeat;background-position:center}.radio{border-radius:50%}.radio:checked{border-color:var(--color-primary);background-color:var(--bg-surface-lowest);background-image:radial-gradient(circle, var(--color-primary) 0 4px, transparent 5px)}.control{display:inline-flex;align-items:center;gap:8px;font-family:var(--font-body);font-size:.875rem;color:var(--text-primary);cursor:pointer;user-select:none}.control:has(:disabled){cursor:not-allowed;color:var(--text-disabled)}.switch{appearance:none;-webkit-appearance:none;position:relative;width:32px;height:18px;margin:0;padding:0;background:var(--border-color-strong);border-radius:var(--radius-full);cursor:pointer;vertical-align:middle;transition:background-color var(--transition-fast)}.switch::before{content:"";position:absolute;top:2px;left:2px;width:14px;height:14px;background:#fff;border-radius:50%;box-shadow:var(--shadow-xs);transition:transform var(--transition-fast)}.switch:checked{background:var(--color-primary)}.switch:checked::before{transform:translateX(14px)}.switch:focus-visible{outline:none;box-shadow:0 0 0 var(--ring-width) var(--ring-color)}.switch:disabled{opacity:.5;cursor:not-allowed}.select{appearance:none;-webkit-appearance:none;display:block;width:100%;min-height:36px;padding:0 32px 0 12px;background:var(--bg-surface-lowest);color:var(--text-primary);border:1px solid var(--border-color);border-radius:var(--radius-sm);font-family:var(--font-body);font-size:.875rem;line-height:1.4;cursor:pointer;background-image:url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none'><path d='M4 6l4 4 4-4' stroke='%2371717a' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/></svg>");background-repeat:no-repeat;background-position:right 12px center;background-size:16px;transition:border-color var(--transition-fast),box-shadow var(--transition-fast)}.select:hover:not(:disabled):not(:focus){border-color:var(--border-color-strong)}.select:focus{outline:none;border-color:var(--border-focus);box-shadow:none}.select:disabled{background-color:var(--bg-surface-low);color:var(--text-disabled);cursor:not-allowed}.select.sm{min-height:28px;font-size:.8125rem;padding:0 24px 0 8px}.select.lg{min-height:44px;font-size:.9375rem;padding:0 40px 0 16px}.table{width:100%;border-collapse:collapse;font-family:var(--font-body);font-size:.875rem;color:var(--text-primary);background:var(--bg-surface-lowest)}.table th,.table td{padding:12px 16px;text-align:left;vertical-align:middle;border-bottom:1px solid var(--hairline-color)}.table thead th{font-size:.75rem;font-weight:600;color:var(--text-muted);text-transform:uppercase;letter-spacing:.04em;background:var(--bg-surface-low);border-bottom:1px solid var(--border-color);white-space:nowrap}.table tbody tr{transition:background-color var(--transition-fast)}.table tbody tr:last-child td{border-bottom:0}.table.hoverable tbody tr:hover{background:var(--bg-surface-low)}.table.striped tbody tr:nth-child(odd){background:var(--bg-surface-low)}.table.compact th,.table.compact td{padding:8px 12px}.table.bordered{border:1px solid var(--border-color);border-radius:var(--radius-md);overflow:hidden}.table.bordered th,.table.bordered td{border-right:1px solid var(--hairline-color)}.table.bordered th:last-child,.table.bordered td:last-child{border-right:0}.table .num{text-align:right;font-variant-numeric:tabular-nums}.table.resizable{table-layout:fixed}.table.resizable thead th,.table.resizable tbody td{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.table.resizable thead th{position:relative}.table.resizable tbody td>.cny-row{min-width:0}.table.resizable .th-resizer{position:absolute;top:0;right:0;width:6px;height:100%;cursor:col-resize;user-select:none;touch-action:none;z-index:1;background:rgba(0,0,0,0);transition:background-color var(--transition-fast)}.table.resizable .th-resizer::after{content:"";position:absolute;top:20%;right:2px;width:1px;height:60%;background:var(--border-color);transition:background-color var(--transition-fast)}.table.resizable .th-resizer:hover::after,.table.resizable .th-resizer.resizing::after{background:var(--color-primary);width:2px}.table.resizable .th-resizer:hover,.table.resizable .th-resizer.resizing{background:color-mix(in srgb, var(--color-primary) 8%, transparent)}.table.resizable.is-resizing{cursor:col-resize;user-select:none}.table-wrap{overflow-x:auto;border:1px solid var(--border-color);border-radius:var(--radius-md);background:var(--bg-surface-lowest)}.table-wrap .table{background:rgba(0,0,0,0)}.table-wrap .table th,.table-wrap .table td{white-space:nowrap}.avatar{position:relative;display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;width:32px;height:32px;background:var(--color-primary-soft);color:var(--color-primary);border-radius:50%;font-family:var(--font-body);font-size:.8125rem;font-weight:600;letter-spacing:-0.01em;user-select:none}.avatar img,.avatar svg{width:100%;height:100%;object-fit:cover;display:block;border-radius:inherit}.avatar.online::after,.avatar.offline::after,.avatar.busy::after{content:"";position:absolute;bottom:0;right:0;width:30%;height:30%;min-width:8px;min-height:8px;border-radius:50%;transform:translate(15%, 15%);box-shadow:0 0 0 2px var(--bg-surface-lowest);z-index:1}.avatar.online::after{background:var(--color-success)}.avatar.offline::after{background:var(--text-muted)}.avatar.busy::after{background:var(--color-danger)}.avatar.xs{width:20px;height:20px;font-size:.625rem}.avatar.sm{width:24px;height:24px;font-size:.6875rem}.avatar.lg{width:40px;height:40px;font-size:.9375rem}.avatar.xl{width:56px;height:56px;font-size:1.125rem}.avatar.square{border-radius:var(--radius-sm)}.avatar-stack{display:inline-flex;isolation:isolate}.avatar-stack .avatar{box-shadow:0 0 0 2px var(--bg-surface-lowest)}.avatar-stack .avatar+.avatar{margin-left:-8px}.avatar-stack .avatar:hover,.avatar-stack .avatar.online,.avatar-stack .avatar.offline,.avatar-stack .avatar.busy{z-index:2}.avatar-stack .avatar.xs+.avatar.xs{margin-left:-6px}.avatar-stack .avatar.sm+.avatar.sm{margin-left:-7px}.avatar-stack .avatar.lg+.avatar.lg{margin-left:-10px}.avatar-stack .avatar.xl+.avatar.xl{margin-left:-14px}.avatar-stack .avatar.online::after,.avatar-stack .avatar.offline::after,.avatar-stack .avatar.busy::after{box-shadow:0 0 0 2px var(--bg-surface-lowest)}.progress{position:relative;display:block;width:100%;height:6px;background:var(--bg-surface-edge);border-radius:var(--radius-full);overflow:hidden}.progress-bar{display:block;height:100%;width:var(--value, 0%);background:var(--color-primary);border-radius:inherit;transition:width var(--transition-base)}.progress.danger .progress-bar{background:var(--color-danger)}.progress.warning .progress-bar{background:var(--color-warning)}.progress.success .progress-bar{background:var(--color-success)}.progress.info .progress-bar{background:var(--color-info)}.progress.sm{height:4px}.progress.lg{height:10px}.progress.indeterminate .progress-bar{width:40%;animation:cny-progress-slide 1.4s var(--ease-standard) infinite}@keyframes cny-progress-slide{0%{transform:translateX(-100%)}100%{transform:translateX(250%)}}.progress-ring{--value: 0;display:inline-grid;place-items:center;width:40px;height:40px;border-radius:50%;background:conic-gradient(var(--color-primary) calc(var(--value) * 1%), var(--bg-surface-edge) 0);font-family:var(--font-body);font-size:.6875rem;font-weight:600;color:var(--text-primary)}.progress-ring::before{content:"";grid-area:1/1;width:calc(100% - 6px);height:calc(100% - 6px);background:var(--bg-surface-lowest);border-radius:50%}.progress-ring>*{grid-area:1/1}.progress-ring.sm{width:28px;height:28px;font-size:.5625rem}.progress-ring.lg{width:56px;height:56px;font-size:.8125rem}.skeleton{display:block;background:var(--bg-surface-edge);border-radius:var(--radius-sm);position:relative;overflow:hidden;color:rgba(0,0,0,0);user-select:none}.skeleton::after{content:"";position:absolute;inset:0;transform:translateX(-100%);background:linear-gradient(90deg, transparent 0%, rgba(255, 255, 255, 0.45) 50%, transparent 100%);animation:cny-skeleton-shimmer 1.6s infinite}.skeleton.text{height:.875rem;border-radius:var(--radius-xs);margin:4px 0}.skeleton.title{height:1.25rem;width:60%;border-radius:var(--radius-xs)}.skeleton.circle{border-radius:50%}.skeleton.button{height:36px;width:96px;border-radius:var(--radius-sm)}.skeleton.avatar{width:32px;height:32px;border-radius:50%}@keyframes cny-skeleton-shimmer{100%{transform:translateX(100%)}}@media(prefers-reduced-motion: reduce){.skeleton::after{animation:none}}.cny-dark .skeleton::after{background:linear-gradient(90deg, transparent 0%, rgba(255, 255, 255, 0.08) 50%, transparent 100%)}@media(prefers-color-scheme: dark){.skeleton::after{background:linear-gradient(90deg, transparent 0%, rgba(255, 255, 255, 0.08) 50%, transparent 100%)}}.has-tooltip{position:relative}.has-tooltip::before,.has-tooltip::after{position:absolute;left:50%;opacity:0;pointer-events:none;transition:opacity var(--transition-fast),transform var(--transition-fast);z-index:50}.has-tooltip::before{content:attr(data-tooltip);bottom:calc(100% + 8px);transform:translate(-50%, 4px);padding:6px 10px;background:var(--color-neutral);color:var(--color-neutral-on);font-family:var(--font-body);font-size:.75rem;font-weight:500;line-height:1.3;white-space:nowrap;border-radius:var(--radius-sm);box-shadow:var(--shadow-md);max-width:240px}.has-tooltip::after{content:"";bottom:calc(100% + 2px);transform:translate(-50%, 4px);border:4px solid rgba(0,0,0,0);border-top-color:var(--color-neutral)}.has-tooltip:hover::before,.has-tooltip:hover::after,.has-tooltip:focus-visible::before,.has-tooltip:focus-visible::after{opacity:1;transform:translate(-50%, 0)}.has-tooltip.tooltip-bottom::before{bottom:auto;top:calc(100% + 8px)}.has-tooltip.tooltip-bottom::after{bottom:auto;top:calc(100% + 2px);border-top-color:rgba(0,0,0,0);border-bottom-color:var(--color-neutral)}@media(prefers-reduced-motion: reduce){.has-tooltip::before,.has-tooltip::after{transition:opacity var(--transition-fast)}}.cny-scroll,.cny-scroll-region{scrollbar-width:thin;scrollbar-color:var(--border-color) rgba(0,0,0,0)}.cny-scroll::-webkit-scrollbar,.cny-scroll-region::-webkit-scrollbar{width:12px;height:12px}.cny-scroll::-webkit-scrollbar-track,.cny-scroll-region::-webkit-scrollbar-track{background:rgba(0,0,0,0)}.cny-scroll::-webkit-scrollbar-thumb,.cny-scroll-region::-webkit-scrollbar-thumb{background-color:var(--border-color);border-radius:var(--radius-full);border:3px solid rgba(0,0,0,0);background-clip:content-box;transition:background-color var(--transition-fast)}.cny-scroll::-webkit-scrollbar-thumb:hover,.cny-scroll-region::-webkit-scrollbar-thumb:hover{background-color:var(--text-muted);background-clip:content-box}.cny-scroll::-webkit-scrollbar-thumb:active,.cny-scroll-region::-webkit-scrollbar-thumb:active{background-color:var(--text-secondary);background-clip:content-box}.cny-scroll::-webkit-scrollbar-corner,.cny-scroll-region::-webkit-scrollbar-corner{background:rgba(0,0,0,0)}.cny-scroll.thin::-webkit-scrollbar,.thin.cny-scroll-region::-webkit-scrollbar{width:8px;height:8px}.cny-scroll.thin::-webkit-scrollbar-thumb,.thin.cny-scroll-region::-webkit-scrollbar-thumb{border-width:2px}.cny-scroll.subtle::-webkit-scrollbar-thumb,.subtle.cny-scroll-region::-webkit-scrollbar-thumb{background-color:rgba(0,0,0,0)}.cny-scroll.subtle:hover::-webkit-scrollbar-thumb,.subtle.cny-scroll-region:hover::-webkit-scrollbar-thumb,.cny-scroll.subtle:focus-within::-webkit-scrollbar-thumb,.subtle.cny-scroll-region:focus-within::-webkit-scrollbar-thumb{background-color:var(--border-color);background-clip:content-box}.cny-scroll.overlay::-webkit-scrollbar,.overlay.cny-scroll-region::-webkit-scrollbar{width:10px;height:10px}.cny-scroll.overlay::-webkit-scrollbar-track,.overlay.cny-scroll-region::-webkit-scrollbar-track{background:rgba(0,0,0,0)}.cny-scroll.overlay::-webkit-scrollbar-thumb,.overlay.cny-scroll-region::-webkit-scrollbar-thumb{background-color:color-mix(in srgb, var(--text-muted) 40%, transparent);border-width:2px}.cny-scroll.overlay::-webkit-scrollbar-thumb:hover,.overlay.cny-scroll-region::-webkit-scrollbar-thumb:hover{background-color:color-mix(in srgb, var(--text-muted) 70%, transparent);background-clip:content-box}.cny-scroll.expand,.expand.cny-scroll-region{scrollbar-width:auto}.cny-scroll.expand::-webkit-scrollbar,.expand.cny-scroll-region::-webkit-scrollbar{width:16px;height:16px;background:rgba(0,0,0,0)}.cny-scroll.expand::-webkit-scrollbar-thumb,.expand.cny-scroll-region::-webkit-scrollbar-thumb{border-width:4px;background-color:var(--border-color-strong);transition:border-width .15s ease,background-color var(--transition-fast)}.cny-scroll.expand::-webkit-scrollbar-thumb:hover,.expand.cny-scroll-region::-webkit-scrollbar-thumb:hover,.cny-scroll.expand::-webkit-scrollbar-thumb:active,.expand.cny-scroll-region::-webkit-scrollbar-thumb:active{border-width:1px;background-color:var(--text-muted)}.cny-scroll.primary,.primary.cny-scroll-region{scrollbar-color:var(--color-primary) rgba(0,0,0,0)}.cny-scroll.primary::-webkit-scrollbar-thumb,.primary.cny-scroll-region::-webkit-scrollbar-thumb{background-color:var(--color-primary);background-clip:content-box}.cny-scroll.primary::-webkit-scrollbar-thumb:hover,.primary.cny-scroll-region::-webkit-scrollbar-thumb:hover{background-color:var(--color-primary);background-clip:content-box}.cny-scroll-region{border:1px solid var(--border-color);border-radius:var(--radius-md);background:var(--bg-surface-lowest);overflow:auto;background:linear-gradient(var(--bg-surface-lowest) 30%, rgba(0, 0, 0, 0)) center top,linear-gradient(rgba(0, 0, 0, 0), var(--bg-surface-lowest) 70%) center bottom,radial-gradient(farthest-side at center top, var(--hairline-color), transparent) center top,radial-gradient(farthest-side at center bottom, var(--hairline-color), transparent) center bottom;background-repeat:no-repeat;background-size:100% 24px,100% 24px,100% 8px,100% 8px;background-attachment:local,local,scroll,scroll;background-color:var(--bg-surface-lowest)}.cny-navbar{display:flex;align-items:center;gap:16px;height:56px;padding:0 24px;background:color-mix(in srgb, var(--bg-base) 78%, transparent);backdrop-filter:saturate(180%) blur(14px);-webkit-backdrop-filter:saturate(180%) blur(14px);border-bottom:1px solid var(--hairline-color);position:sticky;top:0;z-index:20;transition:background-color var(--transition-fast),border-color var(--transition-fast)}.cny-navbar.solid{background:var(--bg-base);backdrop-filter:none;-webkit-backdrop-filter:none}.cny-navbar.bordered{border-bottom-color:var(--border-color)}.cny-navbar-brand{display:inline-flex;align-items:center;gap:8px;text-decoration:none;color:var(--text-primary);font-weight:650;letter-spacing:-0.012em;font-size:.9375rem;line-height:1;padding:6px 8px;margin-left:-8px;border-radius:var(--radius-sm);flex-shrink:0;transition:background-color var(--transition-fast)}.cny-navbar-brand:hover{background:var(--bg-surface-low)}.cny-navbar-brand:focus-visible{outline:none;box-shadow:0 0 0 var(--ring-width) var(--ring-color)}.cny-navbar-brand .brand-mark{position:relative;width:22px;height:22px;border-radius:6px;background:radial-gradient(120% 120% at 20% 0%, color-mix(in srgb, white 22%, transparent), transparent 55%),linear-gradient(135deg, var(--color-primary), color-mix(in srgb, var(--color-primary) 60%, black));box-shadow:inset 0 1px 0 color-mix(in srgb, white 25%, transparent),inset 0 0 0 1px color-mix(in srgb, var(--color-primary) 40%, black),0 1px 2px rgba(0,0,0,.18);flex-shrink:0}.cny-navbar-nav{display:flex;align-items:center;gap:2px;flex:1;min-width:0;overflow-x:auto;scrollbar-width:none}.cny-navbar-nav::-webkit-scrollbar{display:none}.cny-navbar-item{position:relative;display:inline-flex;align-items:center;height:32px;padding:0 12px;border-radius:var(--radius-sm);font-size:.875rem;font-weight:500;color:var(--text-secondary);text-decoration:none;white-space:nowrap;transition:background-color var(--transition-fast),color var(--transition-fast)}.cny-navbar-item:hover{background:var(--bg-surface-low);color:var(--text-primary)}.cny-navbar-item:focus-visible{outline:none;box-shadow:0 0 0 var(--ring-width) var(--ring-color)}.cny-navbar-item.active{color:var(--text-primary);font-weight:550}.cny-navbar-item.active::after{content:"";position:absolute;left:12px;right:12px;bottom:-10px;height:2px;border-radius:2px 2px 0 0;background:var(--color-primary)}.cny-navbar-actions{display:flex;align-items:center;gap:8px;margin-left:auto;flex-shrink:0}.cny-navbar-divider{width:1px;height:20px;background:var(--hairline-color);margin:0 4px;flex-shrink:0}@media(max-width: 640px){.cny-navbar{height:52px;padding:0 16px;gap:8px}.cny-navbar-nav{display:none}}.cny-sidebar{display:flex;flex-direction:column;width:240px;flex-shrink:0;padding:24px 20px;border-right:1px solid var(--hairline-color);background:var(--bg-base);overflow-y:auto}.cny-sidebar.sticky{position:sticky;top:52px;align-self:flex-start;max-height:calc(100vh - 52px)}.cny-sidebar.thin{width:200px;padding:20px 16px}.cny-sidebar.wide{width:280px}.cny-sidebar-section{margin-bottom:24px}.cny-sidebar-section:last-child{margin-bottom:0}.cny-sidebar-title{font-size:.6875rem;font-weight:650;letter-spacing:.08em;text-transform:uppercase;color:var(--text-muted);padding:0 8px;margin:0 0 12px}.cny-sidebar-nav{display:flex;flex-direction:column;gap:1px}.cny-sidebar-item{display:flex;align-items:center;gap:8px;padding:6px 8px;border-radius:var(--radius-sm);font-size:.84375rem;color:var(--text-secondary);text-decoration:none;position:relative;transition:background-color var(--transition-fast),color var(--transition-fast)}.cny-sidebar-item:hover{background:var(--bg-surface-low);color:var(--text-primary)}.cny-sidebar-item.active{color:var(--color-primary);font-weight:550;background:color-mix(in srgb, var(--color-primary) 8%, transparent)}.cny-sidebar-item.active::before{content:"";position:absolute;left:calc(-1*20px);top:50%;transform:translateY(-50%);width:2px;height:16px;background:var(--color-primary);border-radius:0 2px 2px 0}.cny-sidebar-item.disabled{color:var(--text-muted);pointer-events:none;opacity:.55}.cny-sidebar-item .cny-sidebar-item-icon{width:14px;height:14px;flex-shrink:0;opacity:.75}.cny-sidebar-item .cny-sidebar-item-badge{margin-left:auto}.cny-sidebar.collapsed{width:60px;padding:20px 8px;align-items:center}.cny-sidebar.collapsed .cny-sidebar-title{display:none}.cny-sidebar.collapsed .cny-sidebar-item{justify-content:center;padding:8px}.cny-sidebar.collapsed .cny-sidebar-item span:not(.cny-sidebar-item-icon):not(.cny-sidebar-item-badge){display:none}.cny-sidebar.collapsed .cny-sidebar-item .cny-sidebar-item-badge{display:none}.cny-sidebar.collapsed .cny-sidebar-item.active::before{left:-8px}@media(max-width: 900px){.cny-sidebar.responsive{display:none}}.cny-text{font-family:var(--font-body);color:var(--text-primary);margin:0}.cny-text-display{font-family:var(--font-display);font-size:clamp(2.5rem,5vw,4rem);font-weight:500;line-height:1.05;letter-spacing:-0.03em}.cny-text-h1{font-family:var(--font-display);font-size:clamp(1.875rem,3.2vw,2.5rem);font-weight:500;line-height:1.15;letter-spacing:-0.025em}.cny-text-h2{font-family:var(--font-display);font-size:clamp(1.5rem,2.4vw,1.875rem);font-weight:500;line-height:1.2;letter-spacing:-0.02em}.cny-text-h3{font-family:var(--font-body);font-size:1.25rem;font-weight:600;line-height:1.3;letter-spacing:-0.015em}.cny-text-h4{font-family:var(--font-body);font-size:1.0625rem;font-weight:600;line-height:1.35;letter-spacing:-0.01em}.cny-text-h5{font-family:var(--font-body);font-size:.9375rem;font-weight:600;line-height:1.4;letter-spacing:-0.005em}.cny-text-h6{font-family:var(--font-body);font-size:.8125rem;font-weight:600;line-height:1.4;letter-spacing:var(--track-wide);text-transform:uppercase;color:var(--text-muted)}.cny-text-lead{font-family:var(--font-body);font-size:1.125rem;font-weight:400;line-height:1.55;color:var(--text-secondary)}.cny-text-body{font-family:var(--font-body);font-size:.9375rem;font-weight:400;line-height:1.6}.cny-text-small{font-family:var(--font-body);font-size:.8125rem;font-weight:400;line-height:1.5;color:var(--text-secondary)}.cny-text-caption{font-family:var(--font-body);font-size:.75rem;font-weight:400;line-height:1.5;color:var(--text-muted)}.cny-text-code{font-family:var(--font-mono);font-size:.8125rem;padding:.1em .35em;border-radius:var(--radius-xs);background:var(--bg-surface-low);color:var(--text-primary)}.cny-text-kbd{font-family:var(--font-mono);font-size:.75rem;padding:.1em .4em;border-radius:var(--radius-xs);background:var(--bg-surface-lowest);color:var(--text-primary);box-shadow:inset 0 0 0 1px var(--border-color),0 1px 0 0 var(--border-color)}.cny-weight-regular{font-weight:400}.cny-weight-medium{font-weight:500}.cny-weight-semibold{font-weight:600}.cny-weight-bold{font-weight:700}.cny-text-left{text-align:left}.cny-text-center{text-align:center}.cny-text-right{text-align:right}.cny-text-justify{text-align:justify}.cny-field{display:flex;flex-direction:column;gap:8px}.cny-field-label-row{display:flex;align-items:baseline;justify-content:space-between;gap:8px}.cny-field-label{display:inline-flex;align-items:center;gap:4px;font-family:var(--font-body);font-size:.8125rem;font-weight:500;color:var(--text-secondary)}.cny-field-label .cny-field-required{color:var(--color-danger);font-weight:500}.cny-field-label .cny-field-optional{font-size:.6875rem;font-weight:400;color:var(--text-muted);padding:1px 6px;border-radius:var(--radius-full);background:var(--bg-surface-low)}.cny-field-counter{font-family:var(--font-mono);font-size:.6875rem;color:var(--text-muted);font-variant-numeric:tabular-nums}.cny-field-counter.danger{color:var(--color-danger)}.cny-field-hint{font-size:.75rem;color:var(--text-muted);line-height:1.5}.cny-field-hint.danger{color:var(--color-danger)}.cny-field-hint.warning{color:var(--color-warning)}.cny-field-hint.success{color:var(--color-success)}.cny-input-affix{position:relative;display:flex;align-items:stretch;width:100%}.cny-input-affix .cny-input-prefix,.cny-input-affix .cny-input-suffix{position:absolute;top:50%;transform:translateY(-50%);display:inline-flex;align-items:center;justify-content:center;color:var(--text-muted);pointer-events:none}.cny-input-affix .cny-input-prefix{left:12px}.cny-input-affix .cny-input-suffix{right:12px}.cny-input-affix .cny-input-action{position:absolute;top:50%;transform:translateY(-50%);right:6px;display:inline-flex;align-items:center;justify-content:center;width:24px;height:24px;border:0;border-radius:var(--radius-xs);background:rgba(0,0,0,0);color:var(--text-muted);cursor:pointer;transition:background-color 120ms,color 120ms}.cny-input-affix .cny-input-action:hover{background:var(--bg-surface-low);color:var(--text-primary)}.cny-input-affix .cny-input-action:focus-visible{outline:none;box-shadow:0 0 0 2px var(--ring-color)}.cny-input-affix.has-prefix>.input{padding-left:calc(12px + 18px + 6px)}.cny-input-affix.has-suffix>.input{padding-right:calc(12px + 18px + 6px)}.cny-input-affix.has-action>.input{padding-right:32px}.cny-select-trigger{display:inline-flex;align-items:center;justify-content:space-between;width:100%;min-height:36px;gap:8px;padding:0 12px;background:var(--bg-surface-lowest);color:var(--text-primary);border:1px solid var(--border-color);border-radius:var(--radius-sm);font-family:var(--font-body);font-size:.875rem;line-height:1;cursor:pointer;transition:border-color var(--transition-fast),box-shadow var(--transition-fast)}.cny-select-trigger[data-placeholder]{color:var(--text-muted)}.cny-select-trigger:hover:not([data-disabled]){border-color:var(--border-color-strong)}.cny-select-trigger:focus-visible,.cny-select-trigger[data-state=open]{outline:none;border-color:var(--border-focus);box-shadow:none}.cny-select-trigger[data-disabled]{background:var(--bg-surface-low);color:var(--text-disabled);cursor:not-allowed}.cny-select-trigger.sm{min-height:28px;font-size:.8125rem;padding:0 8px}.cny-select-trigger.lg{min-height:44px;font-size:.9375rem;padding:0 16px}.cny-select-trigger.danger{border-color:var(--color-danger)}.cny-select-trigger.danger:focus-visible,.cny-select-trigger.danger[data-state=open]{border-color:var(--color-danger);box-shadow:none}.cny-select-trigger.warning{border-color:var(--color-warning)}.cny-select-trigger.warning:focus-visible,.cny-select-trigger.warning[data-state=open]{border-color:var(--color-warning);box-shadow:none}.cny-select-trigger.success{border-color:var(--color-success)}.cny-select-trigger.success:focus-visible,.cny-select-trigger.success[data-state=open]{border-color:var(--color-success);box-shadow:none}.cny-select-chevron{color:var(--text-muted);flex-shrink:0;transition:transform 150ms var(--ease-standard)}[data-state=open] .cny-select-chevron{transform:rotate(180deg)}.cny-select-content{z-index:60;min-width:var(--radix-select-trigger-width);max-height:var(--radix-select-content-available-height);padding:4px;border-radius:var(--radius-md);background:var(--bg-surface-lowest);box-shadow:var(--shadow-lg),0 0 0 1px var(--border-color);overflow:hidden;animation:cny-select-pop 160ms cubic-bezier(0.2, 0, 0, 1)}@keyframes cny-select-pop{from{opacity:0;transform:translateY(-4px) scale(0.98)}to{opacity:1;transform:translateY(0) scale(1)}}.cny-select-viewport{padding:2px}.cny-select-item{position:relative;display:flex;align-items:center;gap:8px;padding:6px 28px 6px 10px;border-radius:var(--radius-sm);font-size:.875rem;color:var(--text-primary);cursor:pointer;user-select:none}.cny-select-item[data-highlighted]{outline:none;background:var(--bg-surface-low)}.cny-select-item[data-state=checked]{color:var(--color-primary);font-weight:500}.cny-select-item[data-disabled]{color:var(--text-disabled);cursor:not-allowed}.cny-select-indicator{position:absolute;right:8px;display:inline-flex;color:var(--color-primary)}.cny-select-group-label{padding:6px 10px 4px;font-size:.6875rem;font-weight:600;text-transform:uppercase;letter-spacing:.08em;color:var(--text-muted)}.cny-select-separator{height:1px;background:var(--hairline-color);margin:4px 0}.cny-multiselect-trigger{display:inline-flex;align-items:center;flex-wrap:wrap;gap:4px;width:100%;min-height:36px;padding:3px 32px 3px 6px;background:var(--bg-surface-lowest);color:var(--text-primary);border:1px solid var(--border-color);border-radius:var(--radius-sm);font-family:var(--font-body);font-size:.875rem;cursor:text;position:relative;transition:border-color var(--transition-fast),box-shadow var(--transition-fast)}.cny-multiselect-trigger:hover:not([data-disabled]){border-color:var(--border-color-strong)}.cny-multiselect-trigger[data-state=open],.cny-multiselect-trigger:focus-within{border-color:var(--border-focus);box-shadow:none}.cny-multiselect-trigger[data-disabled]{background:var(--bg-surface-low);color:var(--text-disabled);cursor:not-allowed}.cny-multiselect-trigger.sm{min-height:28px;font-size:.8125rem}.cny-multiselect-trigger.lg{min-height:44px;font-size:.9375rem}.cny-multiselect-trigger.danger{border-color:var(--color-danger)}.cny-multiselect-trigger.danger:focus-within,.cny-multiselect-trigger.danger[data-state=open]{border-color:var(--color-danger);box-shadow:none}.cny-multiselect-trigger.warning{border-color:var(--color-warning)}.cny-multiselect-trigger.warning:focus-within,.cny-multiselect-trigger.warning[data-state=open]{border-color:var(--color-warning);box-shadow:none}.cny-multiselect-trigger.success{border-color:var(--color-success)}.cny-multiselect-trigger.success:focus-within,.cny-multiselect-trigger.success[data-state=open]{border-color:var(--color-success);box-shadow:none}.cny-multiselect-trigger .cny-multiselect-placeholder{color:var(--text-muted);padding:4px 6px}.cny-multiselect-trigger .cny-multiselect-input{flex:1 1 60px;min-width:60px;border:0;outline:none;background:rgba(0,0,0,0);color:inherit;font:inherit;padding:4px 6px}.cny-multiselect-trigger .cny-multiselect-chevron{position:absolute;right:8px;top:50%;transform:translateY(-50%);color:var(--text-muted);pointer-events:none;transition:transform 150ms var(--ease-standard)}.cny-multiselect-trigger[data-state=open] .cny-multiselect-chevron{transform:translateY(-50%) rotate(180deg)}.cny-chip{display:inline-flex;align-items:center;gap:4px;padding:2px 4px 2px 8px;border-radius:var(--radius-sm);background:var(--color-primary-soft);color:var(--color-primary);font-size:.8125rem;line-height:1.3;max-width:100%}.cny-chip .cny-chip-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.cny-chip .cny-chip-remove{display:inline-flex;align-items:center;justify-content:center;width:16px;height:16px;border:0;border-radius:3px;background:rgba(0,0,0,0);color:inherit;cursor:pointer;opacity:.7}.cny-chip .cny-chip-remove:hover{opacity:1;background:hsla(0,0%,100%,.4)}.cny-chip .cny-chip-remove:focus-visible{outline:none;box-shadow:0 0 0 2px currentColor}.cny-chip.danger{background:var(--color-danger-soft);color:var(--color-danger)}.cny-chip.warning{background:var(--color-warning-soft);color:var(--color-warning)}.cny-chip.success{background:var(--color-success-soft);color:var(--color-success)}.cny-chip.neutral{background:var(--bg-surface-low);color:var(--text-secondary)}.cny-popover{z-index:60;min-width:var(--radix-popover-trigger-width);max-height:min(320px,var(--radix-popover-content-available-height));padding:4px;border-radius:var(--radius-md);background:var(--bg-surface-lowest);box-shadow:var(--shadow-lg),0 0 0 1px var(--border-color);overflow:hidden;animation:cny-select-pop 160ms cubic-bezier(0.2, 0, 0, 1)}.cny-popover [cmdk-list]{max-height:280px;overflow-y:auto;scrollbar-width:thin;padding:2px}.cny-popover [cmdk-input]{width:100%;margin:2px 0 4px;padding:6px 10px;border:0;outline:none;background:rgba(0,0,0,0);color:var(--text-primary);font-size:.875rem;border-bottom:1px solid var(--hairline-color)}.cny-popover [cmdk-input]::placeholder{color:var(--text-muted)}.cny-popover [cmdk-item]{display:flex;align-items:center;gap:8px;padding:6px 10px;border-radius:var(--radius-sm);font-size:.875rem;color:var(--text-primary);cursor:pointer;user-select:none}.cny-popover [cmdk-item][data-selected=true]{background:var(--bg-surface-low)}.cny-popover [cmdk-item] .cny-check{margin-left:auto;color:var(--color-primary)}.cny-popover [cmdk-empty]{padding:20px 12px;text-align:center;color:var(--text-muted);font-size:.875rem}.cny-popover [cmdk-group-heading]{padding:6px 10px 4px;font-size:.6875rem;font-weight:600;text-transform:uppercase;letter-spacing:.08em;color:var(--text-muted)}.cny-textarea-autogrow{display:block;width:100%;resize:none;overflow:hidden}.p-0{padding:0}.m-0{margin:0}.px-0{padding-left:0;padding-right:0}.py-0{padding-top:0;padding-bottom:0}.mx-0{margin-left:0;margin-right:0}.my-0{margin-top:0;margin-bottom:0}.pt-0{padding-top:0}.pr-0{padding-right:0}.pb-0{padding-bottom:0}.pl-0{padding-left:0}.mt-0{margin-top:0}.mr-0{margin-right:0}.mb-0{margin-bottom:0}.ml-0{margin-left:0}.gap-0{gap:0}.gap-x-0{column-gap:0}.gap-y-0{row-gap:0}.p-1{padding:4px}.m-1{margin:4px}.px-1{padding-left:4px;padding-right:4px}.py-1{padding-top:4px;padding-bottom:4px}.mx-1{margin-left:4px;margin-right:4px}.my-1{margin-top:4px;margin-bottom:4px}.pt-1{padding-top:4px}.pr-1{padding-right:4px}.pb-1{padding-bottom:4px}.pl-1{padding-left:4px}.mt-1{margin-top:4px}.mr-1{margin-right:4px}.mb-1{margin-bottom:4px}.ml-1{margin-left:4px}.gap-1{gap:4px}.gap-x-1{column-gap:4px}.gap-y-1{row-gap:4px}.p-2{padding:8px}.m-2{margin:8px}.px-2{padding-left:8px;padding-right:8px}.py-2{padding-top:8px;padding-bottom:8px}.mx-2{margin-left:8px;margin-right:8px}.my-2{margin-top:8px;margin-bottom:8px}.pt-2{padding-top:8px}.pr-2{padding-right:8px}.pb-2{padding-bottom:8px}.pl-2{padding-left:8px}.mt-2{margin-top:8px}.mr-2{margin-right:8px}.mb-2{margin-bottom:8px}.ml-2{margin-left:8px}.gap-2{gap:8px}.gap-x-2{column-gap:8px}.gap-y-2{row-gap:8px}.p-3{padding:12px}.m-3{margin:12px}.px-3{padding-left:12px;padding-right:12px}.py-3{padding-top:12px;padding-bottom:12px}.mx-3{margin-left:12px;margin-right:12px}.my-3{margin-top:12px;margin-bottom:12px}.pt-3{padding-top:12px}.pr-3{padding-right:12px}.pb-3{padding-bottom:12px}.pl-3{padding-left:12px}.mt-3{margin-top:12px}.mr-3{margin-right:12px}.mb-3{margin-bottom:12px}.ml-3{margin-left:12px}.gap-3{gap:12px}.gap-x-3{column-gap:12px}.gap-y-3{row-gap:12px}.p-4{padding:16px}.m-4{margin:16px}.px-4{padding-left:16px;padding-right:16px}.py-4{padding-top:16px;padding-bottom:16px}.mx-4{margin-left:16px;margin-right:16px}.my-4{margin-top:16px;margin-bottom:16px}.pt-4{padding-top:16px}.pr-4{padding-right:16px}.pb-4{padding-bottom:16px}.pl-4{padding-left:16px}.mt-4{margin-top:16px}.mr-4{margin-right:16px}.mb-4{margin-bottom:16px}.ml-4{margin-left:16px}.gap-4{gap:16px}.gap-x-4{column-gap:16px}.gap-y-4{row-gap:16px}.p-5{padding:20px}.m-5{margin:20px}.px-5{padding-left:20px;padding-right:20px}.py-5{padding-top:20px;padding-bottom:20px}.mx-5{margin-left:20px;margin-right:20px}.my-5{margin-top:20px;margin-bottom:20px}.pt-5{padding-top:20px}.pr-5{padding-right:20px}.pb-5{padding-bottom:20px}.pl-5{padding-left:20px}.mt-5{margin-top:20px}.mr-5{margin-right:20px}.mb-5{margin-bottom:20px}.ml-5{margin-left:20px}.gap-5{gap:20px}.gap-x-5{column-gap:20px}.gap-y-5{row-gap:20px}.p-6{padding:24px}.m-6{margin:24px}.px-6{padding-left:24px;padding-right:24px}.py-6{padding-top:24px;padding-bottom:24px}.mx-6{margin-left:24px;margin-right:24px}.my-6{margin-top:24px;margin-bottom:24px}.pt-6{padding-top:24px}.pr-6{padding-right:24px}.pb-6{padding-bottom:24px}.pl-6{padding-left:24px}.mt-6{margin-top:24px}.mr-6{margin-right:24px}.mb-6{margin-bottom:24px}.ml-6{margin-left:24px}.gap-6{gap:24px}.gap-x-6{column-gap:24px}.gap-y-6{row-gap:24px}.p-8{padding:32px}.m-8{margin:32px}.px-8{padding-left:32px;padding-right:32px}.py-8{padding-top:32px;padding-bottom:32px}.mx-8{margin-left:32px;margin-right:32px}.my-8{margin-top:32px;margin-bottom:32px}.pt-8{padding-top:32px}.pr-8{padding-right:32px}.pb-8{padding-bottom:32px}.pl-8{padding-left:32px}.mt-8{margin-top:32px}.mr-8{margin-right:32px}.mb-8{margin-bottom:32px}.ml-8{margin-left:32px}.gap-8{gap:32px}.gap-x-8{column-gap:32px}.gap-y-8{row-gap:32px}.p-10{padding:40px}.m-10{margin:40px}.px-10{padding-left:40px;padding-right:40px}.py-10{padding-top:40px;padding-bottom:40px}.mx-10{margin-left:40px;margin-right:40px}.my-10{margin-top:40px;margin-bottom:40px}.pt-10{padding-top:40px}.pr-10{padding-right:40px}.pb-10{padding-bottom:40px}.pl-10{padding-left:40px}.mt-10{margin-top:40px}.mr-10{margin-right:40px}.mb-10{margin-bottom:40px}.ml-10{margin-left:40px}.gap-10{gap:40px}.gap-x-10{column-gap:40px}.gap-y-10{row-gap:40px}.p-12{padding:48px}.m-12{margin:48px}.px-12{padding-left:48px;padding-right:48px}.py-12{padding-top:48px;padding-bottom:48px}.mx-12{margin-left:48px;margin-right:48px}.my-12{margin-top:48px;margin-bottom:48px}.pt-12{padding-top:48px}.pr-12{padding-right:48px}.pb-12{padding-bottom:48px}.pl-12{padding-left:48px}.mt-12{margin-top:48px}.mr-12{margin-right:48px}.mb-12{margin-bottom:48px}.ml-12{margin-left:48px}.gap-12{gap:48px}.gap-x-12{column-gap:48px}.gap-y-12{row-gap:48px}.p-16{padding:64px}.m-16{margin:64px}.px-16{padding-left:64px;padding-right:64px}.py-16{padding-top:64px;padding-bottom:64px}.mx-16{margin-left:64px;margin-right:64px}.my-16{margin-top:64px;margin-bottom:64px}.pt-16{padding-top:64px}.pr-16{padding-right:64px}.pb-16{padding-bottom:64px}.pl-16{padding-left:64px}.mt-16{margin-top:64px}.mr-16{margin-right:64px}.mb-16{margin-bottom:64px}.ml-16{margin-left:64px}.gap-16{gap:64px}.gap-x-16{column-gap:64px}.gap-y-16{row-gap:64px}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.grid{display:grid}.inline-grid{display:inline-grid}.hidden{display:none}.flex-row{flex-direction:row}.flex-col{flex-direction:column}.flex-row-reverse{flex-direction:row-reverse}.flex-col-reverse{flex-direction:column-reverse}.flex-wrap{flex-wrap:wrap}.flex-nowrap{flex-wrap:nowrap}.flex-1{flex:1 1 0%}.flex-auto{flex:auto}.flex-none{flex:none}.items-start{align-items:flex-start}.items-center{align-items:center}.items-end{align-items:flex-end}.items-stretch{align-items:stretch}.items-baseline{align-items:baseline}.justify-start{justify-content:flex-start}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.justify-between{justify-content:space-between}.justify-around{justify-content:space-around}.justify-evenly{justify-content:space-evenly}.grid-cols-1{grid-template-columns:repeat(1, minmax(0, 1fr))}.grid-cols-2{grid-template-columns:repeat(2, minmax(0, 1fr))}.grid-cols-3{grid-template-columns:repeat(3, minmax(0, 1fr))}.grid-cols-4{grid-template-columns:repeat(4, minmax(0, 1fr))}.grid-cols-5{grid-template-columns:repeat(5, minmax(0, 1fr))}.grid-cols-6{grid-template-columns:repeat(6, minmax(0, 1fr))}.grid-cols-7{grid-template-columns:repeat(7, minmax(0, 1fr))}.grid-cols-8{grid-template-columns:repeat(8, minmax(0, 1fr))}.grid-cols-9{grid-template-columns:repeat(9, minmax(0, 1fr))}.grid-cols-10{grid-template-columns:repeat(10, minmax(0, 1fr))}.grid-cols-11{grid-template-columns:repeat(11, minmax(0, 1fr))}.grid-cols-12{grid-template-columns:repeat(12, minmax(0, 1fr))}.w-full{width:100%}.w-auto{width:auto}.w-fit{width:fit-content}.h-full{height:100%}.h-auto{height:auto}.h-fit{height:fit-content}.cny-container{width:100%;margin-left:auto;margin-right:auto;padding-left:16px;padding-right:16px}.cny-container.sm{max-width:640px}.cny-container.md{max-width:768px}.cny-container.lg{max-width:1024px}.cny-container.xl{max-width:1280px}.cny-container.full{max-width:none}.cny-divider{display:block;flex-shrink:0;background:var(--hairline-color);border:0}.cny-divider.horizontal{width:100%;height:1px}.cny-divider.vertical{width:1px;align-self:stretch}.cny-spacer{flex:1 1 auto}.text-primary{color:var(--text-primary)}.text-secondary{color:var(--text-secondary)}.text-muted{color:var(--text-muted)}.text-accent{color:var(--text-accent)}.text-danger{color:var(--color-danger)}.text-success{color:var(--color-success)}.text-warning{color:var(--color-warning)}.text-info{color:var(--color-info)}.cny-label{font-family:var(--font-body);font-size:.6875rem;font-weight:600;letter-spacing:var(--track-wider);text-transform:uppercase;color:var(--text-muted)}.cny-mono{font-family:var(--font-mono);font-feature-settings:"tnum" 1,"zero" 1;letter-spacing:-0.005em}.cny-rule{height:1px;width:100%;background:var(--hairline-color);border:0;margin:24px 0}.cny-index{font-family:var(--font-mono);font-size:.75rem;font-weight:500;letter-spacing:var(--track-wide);color:var(--color-primary);margin-right:12px}.cny-index::after{content:" —";color:var(--text-muted);margin-left:.25em}.cny-grid-paper{background-image:linear-gradient(var(--hairline-color) 1px, transparent 1px),linear-gradient(90deg, var(--hairline-color) 1px, transparent 1px);background-size:4px 4px,4px 4px;background-position:-1px -1px}.cny-grain{position:relative;isolation:isolate}.cny-grain::after{content:"";position:absolute;inset:0;pointer-events:none;z-index:-1;opacity:.35;mix-blend-mode:multiply;background-image:url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='200' height='200'><filter id='n'><feTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='2' stitchTiles='stitch'/><feColorMatrix values='0 0 0 0 0.05 0 0 0 0 0.05 0 0 0 0 0.08 0 0 0 0.25 0'/></filter><rect width='200' height='200' filter='url(%23n)'/></svg>")}.cny-divide-top{box-shadow:0 -1px 0 0 var(--hairline-color)}.cny-divide-bottom{box-shadow:0 1px 0 0 var(--hairline-color)}@keyframes cny-rise{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}.cny-rise{animation:cny-rise 400ms var(--ease-standard) both}.cny-stack{display:flex;flex-direction:column}.cny-row{display:flex;flex-direction:row;align-items:center}.cny-wrap{flex-wrap:wrap}.truncate{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.cny-badge{display:inline-flex;align-items:center;gap:4px;padding:2px 8px;border-radius:var(--radius-full);background:var(--color-neutral-soft);color:var(--text-secondary);font-family:var(--font-body);font-size:.6875rem;font-weight:500;line-height:1.4}.cny-badge.danger{background:var(--color-danger-soft);color:var(--color-danger)}.cny-badge.warning{background:var(--color-warning-soft);color:var(--color-warning)}.cny-badge.success{background:var(--color-success-soft);color:var(--color-success)}.cny-badge.info{background:var(--color-info-soft);color:var(--color-info)}.cny-badge.primary{background:var(--color-primary-soft);color:var(--color-primary)}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Canny UI — table column resizer.
|
|
3
|
+
* Attaches drag handles to every `.table.resizable` on the page.
|
|
4
|
+
*
|
|
5
|
+
* Usage:
|
|
6
|
+
* <script src="canny-ui/dist/table-resize.js" defer></script>
|
|
7
|
+
* <table class="table resizable"> ... </table>
|
|
8
|
+
*
|
|
9
|
+
* Or, for dynamically inserted tables:
|
|
10
|
+
* window.CannyUI.makeTableResizable(tableEl);
|
|
11
|
+
*/
|
|
12
|
+
(function () {
|
|
13
|
+
var MIN_WIDTH = 40;
|
|
14
|
+
|
|
15
|
+
function measureAndFix(table, ths) {
|
|
16
|
+
// Measure under auto layout, then freeze with table-layout: fixed.
|
|
17
|
+
var widths = [];
|
|
18
|
+
for (var i = 0; i < ths.length; i++) widths.push(ths[i].offsetWidth);
|
|
19
|
+
table.style.tableLayout = 'fixed';
|
|
20
|
+
for (var j = 0; j < ths.length; j++) ths[j].style.width = widths[j] + 'px';
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
function makeResizable(table) {
|
|
24
|
+
if (table.dataset.resizableInit === '1') return;
|
|
25
|
+
var ths = table.querySelectorAll('thead th');
|
|
26
|
+
if (!ths.length) return;
|
|
27
|
+
|
|
28
|
+
measureAndFix(table, ths);
|
|
29
|
+
table.dataset.resizableInit = '1';
|
|
30
|
+
|
|
31
|
+
for (var i = 0; i < ths.length; i++) {
|
|
32
|
+
// Last column has nothing to drag against.
|
|
33
|
+
if (i === ths.length - 1) continue;
|
|
34
|
+
attachHandle(table, ths[i]);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function attachHandle(table, th) {
|
|
39
|
+
var resizer = th.querySelector('.th-resizer');
|
|
40
|
+
if (!resizer) {
|
|
41
|
+
resizer = document.createElement('span');
|
|
42
|
+
resizer.className = 'th-resizer';
|
|
43
|
+
resizer.setAttribute('aria-hidden', 'true');
|
|
44
|
+
th.appendChild(resizer);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function pointerDown(e) {
|
|
48
|
+
e.preventDefault();
|
|
49
|
+
e.stopPropagation();
|
|
50
|
+
|
|
51
|
+
var isTouch = e.type === 'touchstart';
|
|
52
|
+
var startX = isTouch ? e.touches[0].clientX : e.clientX;
|
|
53
|
+
var startWidth = th.offsetWidth;
|
|
54
|
+
|
|
55
|
+
resizer.classList.add('resizing');
|
|
56
|
+
table.classList.add('is-resizing');
|
|
57
|
+
document.body.style.cursor = 'col-resize';
|
|
58
|
+
|
|
59
|
+
function move(ev) {
|
|
60
|
+
var clientX = ev.touches ? ev.touches[0].clientX : ev.clientX;
|
|
61
|
+
var next = Math.max(MIN_WIDTH, startWidth + (clientX - startX));
|
|
62
|
+
th.style.width = next + 'px';
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
function stop() {
|
|
66
|
+
resizer.classList.remove('resizing');
|
|
67
|
+
table.classList.remove('is-resizing');
|
|
68
|
+
document.body.style.cursor = '';
|
|
69
|
+
document.removeEventListener('mousemove', move);
|
|
70
|
+
document.removeEventListener('mouseup', stop);
|
|
71
|
+
document.removeEventListener('touchmove', move);
|
|
72
|
+
document.removeEventListener('touchend', stop);
|
|
73
|
+
document.removeEventListener('touchcancel', stop);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
document.addEventListener('mousemove', move);
|
|
77
|
+
document.addEventListener('mouseup', stop);
|
|
78
|
+
document.addEventListener('touchmove', move, { passive: false });
|
|
79
|
+
document.addEventListener('touchend', stop);
|
|
80
|
+
document.addEventListener('touchcancel', stop);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
resizer.addEventListener('mousedown', pointerDown);
|
|
84
|
+
resizer.addEventListener('touchstart', pointerDown, { passive: false });
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
function init() {
|
|
88
|
+
var tables = document.querySelectorAll('.table.resizable');
|
|
89
|
+
for (var i = 0; i < tables.length; i++) makeResizable(tables[i]);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
if (typeof document !== 'undefined') {
|
|
93
|
+
if (document.readyState === 'loading') {
|
|
94
|
+
document.addEventListener('DOMContentLoaded', init);
|
|
95
|
+
} else {
|
|
96
|
+
init();
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
if (typeof window !== 'undefined') {
|
|
101
|
+
window.CannyUI = window.CannyUI || {};
|
|
102
|
+
window.CannyUI.makeTableResizable = makeResizable;
|
|
103
|
+
}
|
|
104
|
+
})();
|
package/package.json
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "canny-ui",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Pure CSS foundation for the Canny-UI design system — tokens, layout utilities, and a battery of enterprise components, shipped as one flat stylesheet.",
|
|
5
|
+
"main": "dist/canny-ui.min.css",
|
|
6
|
+
"style": "dist/canny-ui.min.css",
|
|
7
|
+
"files": [
|
|
8
|
+
"dist",
|
|
9
|
+
"src/tokens",
|
|
10
|
+
"src/base",
|
|
11
|
+
"src/components",
|
|
12
|
+
"src/_utilities.scss",
|
|
13
|
+
"src/canny-ui.scss",
|
|
14
|
+
"src/scripts",
|
|
15
|
+
"README.md"
|
|
16
|
+
],
|
|
17
|
+
"exports": {
|
|
18
|
+
".": "./dist/canny-ui.min.css",
|
|
19
|
+
"./dist/canny-ui.min.css": "./dist/canny-ui.min.css",
|
|
20
|
+
"./table-resize": "./dist/table-resize.js",
|
|
21
|
+
"./table-resize.js": "./dist/table-resize.js",
|
|
22
|
+
"./scss": "./src/canny-ui.scss",
|
|
23
|
+
"./scss/*": "./src/*"
|
|
24
|
+
},
|
|
25
|
+
"devDependencies": {
|
|
26
|
+
"sass": "^1.83.0",
|
|
27
|
+
"vitest": "^2.1.8",
|
|
28
|
+
"@playwright/test": "^1.49.0",
|
|
29
|
+
"serve": "^14.2.4"
|
|
30
|
+
},
|
|
31
|
+
"keywords": [
|
|
32
|
+
"css",
|
|
33
|
+
"scss",
|
|
34
|
+
"design-system",
|
|
35
|
+
"ui",
|
|
36
|
+
"components",
|
|
37
|
+
"enterprise",
|
|
38
|
+
"dashboard",
|
|
39
|
+
"admin"
|
|
40
|
+
],
|
|
41
|
+
"license": "MIT",
|
|
42
|
+
"author": "CannyMinds <prem@cannymindstech.com>",
|
|
43
|
+
"homepage": "https://github.com/CannyMinds/Canny-UI#readme",
|
|
44
|
+
"repository": {
|
|
45
|
+
"type": "git",
|
|
46
|
+
"url": "git+https://github.com/CannyMinds/Canny-UI.git",
|
|
47
|
+
"directory": "packages/core"
|
|
48
|
+
},
|
|
49
|
+
"bugs": {
|
|
50
|
+
"url": "https://github.com/CannyMinds/Canny-UI/issues"
|
|
51
|
+
},
|
|
52
|
+
"publishConfig": {
|
|
53
|
+
"access": "public",
|
|
54
|
+
"registry": "https://registry.npmjs.org/"
|
|
55
|
+
},
|
|
56
|
+
"scripts": {
|
|
57
|
+
"build": "sass src/canny-ui.scss dist/canny-ui.min.css --style=compressed --no-source-map && cp src/scripts/table-resize.js dist/table-resize.js",
|
|
58
|
+
"build:expanded": "sass src/canny-ui.scss dist/canny-ui.css --style=expanded --no-source-map",
|
|
59
|
+
"watch": "sass src/canny-ui.scss dist/canny-ui.css --watch",
|
|
60
|
+
"test": "vitest run",
|
|
61
|
+
"test:unit": "vitest run",
|
|
62
|
+
"test:visual": "playwright test"
|
|
63
|
+
}
|
|
64
|
+
}
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
@use 'tokens/primitives' as *;
|
|
2
|
+
|
|
3
|
+
// ── Spacing ──────────────────────────────────────────────────────────────
|
|
4
|
+
$spaces: (
|
|
5
|
+
0: $space-0, 1: $space-1, 2: $space-2, 3: $space-3, 4: $space-4,
|
|
6
|
+
5: $space-5, 6: $space-6, 8: $space-8, 10: $space-10, 12: $space-12, 16: $space-16
|
|
7
|
+
);
|
|
8
|
+
|
|
9
|
+
@each $key, $value in $spaces {
|
|
10
|
+
.p-#{$key} { padding: $value; }
|
|
11
|
+
.m-#{$key} { margin: $value; }
|
|
12
|
+
.px-#{$key} { padding-left: $value; padding-right: $value; }
|
|
13
|
+
.py-#{$key} { padding-top: $value; padding-bottom: $value; }
|
|
14
|
+
.mx-#{$key} { margin-left: $value; margin-right: $value; }
|
|
15
|
+
.my-#{$key} { margin-top: $value; margin-bottom: $value; }
|
|
16
|
+
.pt-#{$key} { padding-top: $value; }
|
|
17
|
+
.pr-#{$key} { padding-right: $value; }
|
|
18
|
+
.pb-#{$key} { padding-bottom: $value; }
|
|
19
|
+
.pl-#{$key} { padding-left: $value; }
|
|
20
|
+
.mt-#{$key} { margin-top: $value; }
|
|
21
|
+
.mr-#{$key} { margin-right: $value; }
|
|
22
|
+
.mb-#{$key} { margin-bottom: $value; }
|
|
23
|
+
.ml-#{$key} { margin-left: $value; }
|
|
24
|
+
.gap-#{$key} { gap: $value; }
|
|
25
|
+
.gap-x-#{$key} { column-gap: $value; }
|
|
26
|
+
.gap-y-#{$key} { row-gap: $value; }
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
// ── Display ──────────────────────────────────────────────────────────────
|
|
30
|
+
.block { display: block; }
|
|
31
|
+
.inline-block { display: inline-block; }
|
|
32
|
+
.inline { display: inline; }
|
|
33
|
+
.flex { display: flex; }
|
|
34
|
+
.inline-flex { display: inline-flex; }
|
|
35
|
+
.grid { display: grid; }
|
|
36
|
+
.inline-grid { display: inline-grid; }
|
|
37
|
+
.hidden { display: none; }
|
|
38
|
+
|
|
39
|
+
// ── Flex ─────────────────────────────────────────────────────────────────
|
|
40
|
+
.flex-row { flex-direction: row; }
|
|
41
|
+
.flex-col { flex-direction: column; }
|
|
42
|
+
.flex-row-reverse { flex-direction: row-reverse; }
|
|
43
|
+
.flex-col-reverse { flex-direction: column-reverse; }
|
|
44
|
+
.flex-wrap { flex-wrap: wrap; }
|
|
45
|
+
.flex-nowrap { flex-wrap: nowrap; }
|
|
46
|
+
.flex-1 { flex: 1 1 0%; }
|
|
47
|
+
.flex-auto { flex: auto; }
|
|
48
|
+
.flex-none { flex: none; }
|
|
49
|
+
|
|
50
|
+
.items-start { align-items: flex-start; }
|
|
51
|
+
.items-center { align-items: center; }
|
|
52
|
+
.items-end { align-items: flex-end; }
|
|
53
|
+
.items-stretch { align-items: stretch; }
|
|
54
|
+
.items-baseline { align-items: baseline; }
|
|
55
|
+
|
|
56
|
+
.justify-start { justify-content: flex-start; }
|
|
57
|
+
.justify-center { justify-content: center; }
|
|
58
|
+
.justify-end { justify-content: flex-end; }
|
|
59
|
+
.justify-between { justify-content: space-between; }
|
|
60
|
+
.justify-around { justify-content: space-around; }
|
|
61
|
+
.justify-evenly { justify-content: space-evenly; }
|
|
62
|
+
|
|
63
|
+
// ── Grid columns (1–12) ──────────────────────────────────────────────────
|
|
64
|
+
@for $i from 1 through 12 {
|
|
65
|
+
.grid-cols-#{$i} { grid-template-columns: repeat(#{$i}, minmax(0, 1fr)); }
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// ── Size ─────────────────────────────────────────────────────────────────
|
|
69
|
+
.w-full { width: 100%; }
|
|
70
|
+
.w-auto { width: auto; }
|
|
71
|
+
.w-fit { width: fit-content; }
|
|
72
|
+
.h-full { height: 100%; }
|
|
73
|
+
.h-auto { height: auto; }
|
|
74
|
+
.h-fit { height: fit-content; }
|
|
75
|
+
|
|
76
|
+
// ── Container (max-width with responsive inline padding) ─────────────────
|
|
77
|
+
.cny-container {
|
|
78
|
+
width: 100%;
|
|
79
|
+
margin-left: auto;
|
|
80
|
+
margin-right: auto;
|
|
81
|
+
padding-left: #{$space-4};
|
|
82
|
+
padding-right: #{$space-4};
|
|
83
|
+
|
|
84
|
+
&.sm { max-width: 640px; }
|
|
85
|
+
&.md { max-width: 768px; }
|
|
86
|
+
&.lg { max-width: 1024px; }
|
|
87
|
+
&.xl { max-width: 1280px; }
|
|
88
|
+
&.full { max-width: none; }
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// ── Divider ──────────────────────────────────────────────────────────────
|
|
92
|
+
.cny-divider {
|
|
93
|
+
display: block;
|
|
94
|
+
flex-shrink: 0;
|
|
95
|
+
background: var(--hairline-color);
|
|
96
|
+
border: 0;
|
|
97
|
+
|
|
98
|
+
&.horizontal { width: 100%; height: 1px; }
|
|
99
|
+
&.vertical { width: 1px; align-self: stretch; }
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// ── Spacer (flex filler) ─────────────────────────────────────────────────
|
|
103
|
+
.cny-spacer { flex: 1 1 auto; }
|
|
104
|
+
|
|
105
|
+
// ── Text colors ──────────────────────────────────────────────────────────
|
|
106
|
+
.text-primary { color: var(--text-primary); }
|
|
107
|
+
.text-secondary { color: var(--text-secondary); }
|
|
108
|
+
.text-muted { color: var(--text-muted); }
|
|
109
|
+
.text-accent { color: var(--text-accent); }
|
|
110
|
+
.text-danger { color: var(--color-danger); }
|
|
111
|
+
.text-success { color: var(--color-success); }
|
|
112
|
+
.text-warning { color: var(--color-warning); }
|
|
113
|
+
.text-info { color: var(--color-info); }
|
|
114
|
+
|
|
115
|
+
// ── Primitives ───────────────────────────────────────────────────────────
|
|
116
|
+
.cny-label {
|
|
117
|
+
font-family: var(--font-body);
|
|
118
|
+
font-size: 0.6875rem;
|
|
119
|
+
font-weight: 600;
|
|
120
|
+
letter-spacing: var(--track-wider);
|
|
121
|
+
text-transform: uppercase;
|
|
122
|
+
color: var(--text-muted);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
.cny-mono {
|
|
126
|
+
font-family: var(--font-mono);
|
|
127
|
+
font-feature-settings: 'tnum' 1, 'zero' 1;
|
|
128
|
+
letter-spacing: -0.005em;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
.cny-rule {
|
|
132
|
+
height: 1px;
|
|
133
|
+
width: 100%;
|
|
134
|
+
background: var(--hairline-color);
|
|
135
|
+
border: 0;
|
|
136
|
+
margin: #{$space-6} 0;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
.cny-index {
|
|
140
|
+
font-family: var(--font-mono);
|
|
141
|
+
font-size: 0.75rem;
|
|
142
|
+
font-weight: 500;
|
|
143
|
+
letter-spacing: var(--track-wide);
|
|
144
|
+
color: var(--color-primary);
|
|
145
|
+
margin-right: #{$space-3};
|
|
146
|
+
&::after { content: ' —'; color: var(--text-muted); margin-left: 0.25em; }
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
.cny-grid-paper {
|
|
150
|
+
background-image:
|
|
151
|
+
linear-gradient(var(--hairline-color) 1px, transparent 1px),
|
|
152
|
+
linear-gradient(90deg, var(--hairline-color) 1px, transparent 1px);
|
|
153
|
+
background-size: #{$grid-unit} #{$grid-unit}, #{$grid-unit} #{$grid-unit};
|
|
154
|
+
background-position: -1px -1px;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
.cny-grain {
|
|
158
|
+
position: relative;
|
|
159
|
+
isolation: isolate;
|
|
160
|
+
|
|
161
|
+
&::after {
|
|
162
|
+
content: '';
|
|
163
|
+
position: absolute;
|
|
164
|
+
inset: 0;
|
|
165
|
+
pointer-events: none;
|
|
166
|
+
z-index: -1;
|
|
167
|
+
opacity: 0.35;
|
|
168
|
+
mix-blend-mode: multiply;
|
|
169
|
+
background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='200' height='200'><filter id='n'><feTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='2' stitchTiles='stitch'/><feColorMatrix values='0 0 0 0 0.05 0 0 0 0 0.05 0 0 0 0 0.08 0 0 0 0.25 0'/></filter><rect width='200' height='200' filter='url(%23n)'/></svg>");
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
.cny-divide-top { box-shadow: 0 -1px 0 0 var(--hairline-color); }
|
|
174
|
+
.cny-divide-bottom { box-shadow: 0 1px 0 0 var(--hairline-color); }
|
|
175
|
+
|
|
176
|
+
@keyframes cny-rise {
|
|
177
|
+
from { opacity: 0; transform: translateY(8px); }
|
|
178
|
+
to { opacity: 1; transform: translateY(0); }
|
|
179
|
+
}
|
|
180
|
+
.cny-rise {
|
|
181
|
+
animation: cny-rise 400ms var(--ease-standard) both;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
.cny-stack { display: flex; flex-direction: column; }
|
|
185
|
+
.cny-row { display: flex; flex-direction: row; align-items: center; }
|
|
186
|
+
.cny-wrap { flex-wrap: wrap; }
|
|
187
|
+
|
|
188
|
+
// Truncate — ellipsizes overflowing text; works inside flex rows.
|
|
189
|
+
.truncate {
|
|
190
|
+
min-width: 0;
|
|
191
|
+
overflow: hidden;
|
|
192
|
+
text-overflow: ellipsis;
|
|
193
|
+
white-space: nowrap;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
// Badge — small inline status pill
|
|
197
|
+
.cny-badge {
|
|
198
|
+
display: inline-flex;
|
|
199
|
+
align-items: center;
|
|
200
|
+
gap: $space-1;
|
|
201
|
+
padding: 2px $space-2;
|
|
202
|
+
border-radius: var(--radius-full);
|
|
203
|
+
background: var(--color-neutral-soft);
|
|
204
|
+
color: var(--text-secondary);
|
|
205
|
+
font-family: var(--font-body);
|
|
206
|
+
font-size: 0.6875rem;
|
|
207
|
+
font-weight: 500;
|
|
208
|
+
line-height: 1.4;
|
|
209
|
+
|
|
210
|
+
&.danger { background: var(--color-danger-soft); color: var(--color-danger); }
|
|
211
|
+
&.warning { background: var(--color-warning-soft); color: var(--color-warning); }
|
|
212
|
+
&.success { background: var(--color-success-soft); color: var(--color-success); }
|
|
213
|
+
&.info { background: var(--color-info-soft); color: var(--color-info); }
|
|
214
|
+
&.primary { background: var(--color-primary-soft); color: var(--color-primary); }
|
|
215
|
+
}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
@use '../tokens/primitives' as *;
|
|
2
|
+
|
|
3
|
+
// Restrained typography — Geist sans for everything by default.
|
|
4
|
+
// Fraunces available as opt-in via `.cny-display` utility.
|
|
5
|
+
@import url('https://fonts.googleapis.com/css2?family=Fraunces:ital,opsz,wght@0,9..144,300..900;1,9..144,300..900&family=Geist+Mono:wght@300..700&family=Geist:wght@300..700&display=swap');
|
|
6
|
+
|
|
7
|
+
.cny-app {
|
|
8
|
+
font-family: var(--font-body);
|
|
9
|
+
font-size: var(--text-base);
|
|
10
|
+
line-height: 1.55;
|
|
11
|
+
color: var(--text-primary);
|
|
12
|
+
font-feature-settings: 'ss01', 'cv11';
|
|
13
|
+
-webkit-font-smoothing: antialiased;
|
|
14
|
+
-moz-osx-font-smoothing: grayscale;
|
|
15
|
+
text-rendering: optimizeLegibility;
|
|
16
|
+
|
|
17
|
+
h1 {
|
|
18
|
+
font-family: var(--font-display);
|
|
19
|
+
font-size: var(--text-3xl);
|
|
20
|
+
font-weight: 600;
|
|
21
|
+
letter-spacing: var(--track-tight);
|
|
22
|
+
line-height: 1.15;
|
|
23
|
+
margin: 0 0 $space-5;
|
|
24
|
+
color: var(--text-primary);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
h2 {
|
|
28
|
+
font-family: var(--font-body);
|
|
29
|
+
font-size: var(--text-2xl);
|
|
30
|
+
font-weight: 600;
|
|
31
|
+
letter-spacing: var(--track-tight);
|
|
32
|
+
line-height: 1.2;
|
|
33
|
+
margin: 0 0 $space-4;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
h3 {
|
|
37
|
+
font-family: var(--font-body);
|
|
38
|
+
font-size: var(--text-xl);
|
|
39
|
+
font-weight: 600;
|
|
40
|
+
letter-spacing: -0.005em;
|
|
41
|
+
line-height: 1.3;
|
|
42
|
+
margin: 0 0 $space-3;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
h4 {
|
|
46
|
+
font-family: var(--font-body);
|
|
47
|
+
font-size: var(--text-lg);
|
|
48
|
+
font-weight: 600;
|
|
49
|
+
line-height: 1.35;
|
|
50
|
+
margin: 0 0 $space-2;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
p {
|
|
54
|
+
margin: 0 0 $space-4;
|
|
55
|
+
max-width: 72ch;
|
|
56
|
+
color: var(--text-secondary);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// Prose anchors only — component classes (e.g. cny-sidebar-item,
|
|
60
|
+
// cny-navbar-item, docs-toc-link) manage their own link styling.
|
|
61
|
+
a:not([class]) {
|
|
62
|
+
color: var(--text-accent);
|
|
63
|
+
text-decoration: underline;
|
|
64
|
+
text-decoration-thickness: 1px;
|
|
65
|
+
text-underline-offset: 0.18em;
|
|
66
|
+
transition: color var(--transition-fast);
|
|
67
|
+
|
|
68
|
+
&:hover { color: var(--color-primary-hover); }
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
small,
|
|
72
|
+
.cny-meta {
|
|
73
|
+
font-size: var(--text-xs);
|
|
74
|
+
color: var(--text-muted);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
code, kbd, pre, samp {
|
|
78
|
+
font-family: var(--font-mono);
|
|
79
|
+
font-size: 0.92em;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
.cny-tabular {
|
|
83
|
+
font-variant-numeric: tabular-nums slashed-zero;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// Opt-in editorial display — use sparingly on marketing/landing surfaces.
|
|
88
|
+
.cny-display {
|
|
89
|
+
font-family: var(--font-display);
|
|
90
|
+
font-weight: 400;
|
|
91
|
+
font-variation-settings: 'opsz' 144;
|
|
92
|
+
letter-spacing: var(--track-tight);
|
|
93
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
// Canny-UI master manifest — order matters.
|
|
2
|
+
@use 'tokens/primitives';
|
|
3
|
+
@use 'tokens/semantic';
|
|
4
|
+
@use 'base/reset';
|
|
5
|
+
@use 'base/typography';
|
|
6
|
+
@use 'components/buttons';
|
|
7
|
+
@use 'components/inputs';
|
|
8
|
+
@use 'components/cards';
|
|
9
|
+
@use 'components/alerts';
|
|
10
|
+
@use 'components/forms';
|
|
11
|
+
@use 'components/table';
|
|
12
|
+
@use 'components/avatar';
|
|
13
|
+
@use 'components/progress';
|
|
14
|
+
@use 'components/skeleton';
|
|
15
|
+
@use 'components/tooltip';
|
|
16
|
+
@use 'components/scrollbar';
|
|
17
|
+
@use 'components/navbar';
|
|
18
|
+
@use 'components/sidebar';
|
|
19
|
+
@use 'components/text';
|
|
20
|
+
@use 'components/fields';
|
|
21
|
+
@use 'utilities';
|