/* ============================================================ components.css — Nychthemeron component skins Styles every `nych-*` primitive. Components render the markup; this file gives them their bronze-and-marble skin. ============================================================ */ /* ============================================================ Button — the signature glowing control ============================================================ */ [class^='nych-button'] { display: inline-flex; align-items: center; justify-content: center; gap: 6px; padding: 7px 14px; border-radius: var(--radius-md); box-shadow: var(--glow-md); border: none; cursor: pointer; transition: box-shadow 0.3s ease; } [class^='nych-button'] > span { display: inline-flex; align-items: center; gap: 5px; line-height: 1; } /* Vertically center text inside buttons — covers nested text wrappers (e.g. the direct-edit .__om-t span) that also receive height:25px */ [class^='nych-button'] > span span { display: inline-flex !important; align-items: center !important; } /* Ensure PrimeIcon elements sit at the correct baseline in buttons */ [class^='nych-button'] i { line-height: 1; flex-shrink: 0; display: inline-flex; align-items: center; } [class^='nych-button']:hover:not(:disabled) { box-shadow: var(--glow-sm); } [class^='nych-button'][data-p~='loading'] { display: inline-flex; } [class^='nych-button'][data-p~='loading'] span { margin-top: 0; } /* severity skins — apply to any nych- element with matching suffix */ [class^='nych-'][class$='-primary'] { background-color: var(--primary); color: var(--primary-fg); } [class^='nych-'][class$='-secondary'], [class^='nych-'][class$='-muted'] { background-color: var(--neutral); color: var(--neutral-fg); } [class^='nych-'][class$='-info'] { background-color: var(--info); color: var(--info-fg); } [class^='nych-'][class$='-success'] { background-color: var(--success); color: var(--success-fg); } [class^='nych-'][class$='-warning'] { background-color: var(--warn); color: var(--warn-fg); } [class^='nych-'][class$='-danger'], [class^='nych-'][class$='-error'] { background-color: var(--danger); color: var(--danger-fg); } button[data-p~='loading'] > .nych-loading-icon { margin-right: 6px; width: 20px; height: 20px; } /* size scale */ [class^='nych-'][data-p~='small'] :not(svg, svg *) { height: 15px !important; font-size: 8pt !important; } [class^='nych-'][data-p~='normal'] :not(svg, svg *) { height: 25px !important; font-size: 12pt !important; } [class^='nych-'][data-p~='large'] :not(svg, svg *) { height: 40px !important; font-size: 20pt !important; } /* ============================================================ Text inputs — InputText, Textarea ============================================================ */ .nych-input, .nych-textarea { font-family: var(--font-sans); width: 100%; padding: 8px 11px; color: var(--text-body); background-color: var(--surface-1); border: 1px solid var(--border); border-radius: var(--radius-md); transition: border-color 0.2s ease, box-shadow 0.2s ease; } .nych-input::placeholder, .nych-textarea::placeholder { color: var(--text-dim); } .nych-input:hover:not(:disabled), .nych-textarea:hover:not(:disabled) { border-color: var(--border-hi); } .nych-input:focus, .nych-textarea:focus { outline: none; border-color: var(--primary); box-shadow: var(--focus-ring); } .nych-input[data-p~='invalid'], .nych-textarea[data-p~='invalid'] { border-color: var(--danger); } .nych-input[data-p~='small'] { padding: 5px 8px; font-size: 0.875rem; } .nych-input[data-p~='large'] { padding: 11px 13px; font-size: 1.125rem; } .nych-textarea { resize: vertical; min-height: 84px; line-height: 1.5; } /* ============================================================ Checkbox + Radio ============================================================ */ .nych-checkbox, .nych-radio { position: relative; display: inline-flex; width: 20px; height: 20px; vertical-align: middle; } .nych-checkbox-input, .nych-radio-input { position: absolute; inset: 0; width: 100%; height: 100%; margin: 0; opacity: 0; cursor: pointer; z-index: 1; } .nych-checkbox-box, .nych-radio-box { display: flex; align-items: center; justify-content: center; width: 20px; height: 20px; background-color: var(--surface-1); border: 1px solid var(--border); transition: background-color 0.2s ease, border-color 0.2s ease; } .nych-checkbox-box { border-radius: var(--radius-sm); } .nych-radio-box { border-radius: 50%; } .nych-checkbox:hover .nych-checkbox-box, .nych-radio:hover .nych-radio-box { border-color: var(--border-hi); } .nych-checkbox[data-p-checked='true'] .nych-checkbox-box { background-color: var(--primary); border-color: var(--primary); } .nych-checkbox-icon { width: 13px; height: 13px; color: var(--primary-fg); fill: var(--primary-fg); stroke: var(--primary-fg); } .nych-checkbox[data-p-disabled='true'] .nych-checkbox-box, .nych-radio[data-p-disabled='true'] .nych-radio-box { opacity: 0.5; } .nych-checkbox-group, .nych-radio-group { display: flex; flex-direction: column; gap: 0.6rem; } .nych-checkbox-input:focus-visible + .nych-checkbox-box, .nych-radio-input:focus-visible + .nych-radio-box { box-shadow: var(--focus-ring); } .nych-checkbox .nych-checkbox-input, .nych-radio .nych-radio-input, .nych-toggleswitch .nych-toggleswitch-input { opacity: 0; } .nych-radio-icon { width: 9px; height: 9px; border-radius: 50%; background-color: transparent; transition: background-color 0.2s ease; } .nych-radio[data-p-checked='true'] .nych-radio-box { border-color: var(--primary); } .nych-radio[data-p-checked='true'] .nych-radio-icon { background-color: var(--primary); } /* ============================================================ Toggle switch ============================================================ */ .nych-toggleswitch { position: relative; display: inline-block; width: 44px; height: 24px; vertical-align: middle; } .nych-toggleswitch-input { position: absolute; inset: 0; width: 100%; height: 100%; margin: 0; opacity: 0; cursor: pointer; z-index: 1; } .nych-toggleswitch-slider { position: absolute; inset: 0; background-color: var(--track); border: 1px solid var(--border); border-radius: var(--radius-full); transition: background-color 0.2s ease, border-color 0.2s ease; } .nych-toggleswitch-handle { position: absolute; top: 50%; left: 3px; width: 16px; height: 16px; transform: translateY(-50%); background-color: var(--text-muted); border-radius: 50%; transition: left 0.2s ease, background-color 0.2s ease; } .nych-toggleswitch[data-p-checked='true'] .nych-toggleswitch-slider { background-color: var(--primary); border-color: var(--primary); } .nych-toggleswitch[data-p-checked='true'] .nych-toggleswitch-handle { left: 25px; background-color: var(--primary-fg); } .nych-toggleswitch-input:focus-visible + .nych-toggleswitch-slider { box-shadow: var(--focus-ring); } .nych-toggleswitch[data-p-disabled='true'] .nych-toggleswitch-slider, .nych-toggleswitch[data-p-disabled='true'] .nych-toggleswitch-handle { opacity: 0.5; } /* ============================================================ Select ============================================================ */ .nych-select { display: inline-flex; align-items: center; justify-content: space-between; gap: 8px; min-width: 13rem; font-family: var(--font-sans); padding: 8px 11px; color: var(--text-body); background-color: var(--surface-1); border: 1px solid var(--border); border-radius: var(--radius-md); cursor: pointer; transition: border-color 0.2s ease, box-shadow 0.2s ease; } .nych-select:hover { border-color: var(--border-hi); } .nych-select[data-p~='focus'] { border-color: var(--primary); box-shadow: var(--focus-ring); } .nych-select[data-p~='disabled'] { cursor: not-allowed; opacity: 0.5; } .nych-select-label { flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .nych-select-label[data-p~='placeholder'] { color: var(--text-dim); } .nych-select-dropdown { display: flex; align-items: center; color: var(--text-muted); } .nych-select-dropdownIcon { width: 14px; height: 14px; } .nych-select-overlay { font-family: var(--font-sans); margin-top: 4px; background-color: var(--surface-2); border: 1px solid var(--border); border-radius: var(--radius-lg); box-shadow: var(--shadow-overlay); overflow: hidden; } .nych-select-list { list-style: none; margin: 0; padding: 4px; max-height: 14rem; overflow-y: auto; } .nych-select-option { padding: 8px 11px; border-radius: var(--radius-sm); color: var(--text-body); cursor: pointer; transition: background-color 0.15s ease; } .nych-select-option[data-p-focused='true'], .nych-select-option:hover { background-color: var(--surface-3); } .nych-select-option[data-p-selected='true'] { background-color: var(--primary); color: var(--primary-fg); } .nych-select-emptyMessage { padding: 8px 11px; color: var(--text-dim); } /* ============================================================ Card ============================================================ */ .nych-card { display: flex; flex-direction: column; background-color: var(--surface-1); border: 1px solid var(--border); border-radius: var(--radius-xl); box-shadow: var(--shadow-card); overflow: hidden; color: var(--text-body); } .nych-card-header :where(img) { display: block; width: 100%; } .nych-card-body { display: flex; flex-direction: column; gap: 12px; padding: 20px; } .nych-card-caption { display: flex; flex-direction: column; gap: 4px; } .nych-card-title { font-family: var(--font-serif); font-size: 1.4rem; letter-spacing: 0.02em; color: var(--text-high); } .nych-card-subtitle { font-family: var(--font-sans); font-size: 0.95rem; color: var(--text-muted); } .nych-card-content { font-family: var(--font-sans); line-height: 1.6; } .nych-card-footer { display: flex; gap: 8px; padding-top: 4px; } /* ============================================================ Message ============================================================ */ .nych-message { color: var(--text-body); background-color: var(--surface-1); border: 1px solid var(--border); border-left: 3px solid var(--border); border-radius: var(--radius-lg); } .nych-message-content { display: flex; align-items: center; gap: 10px; padding: 11px 14px; } .nych-message-icon { display: flex; flex-shrink: 0; width: 18px; height: 18px; } .nych-message-text { font-family: var(--font-sans); line-height: 1.4; } .nych-message-closeButton { display: flex; align-items: center; justify-content: center; margin-left: auto; width: 22px; height: 22px; padding: 0; color: inherit; background: transparent; border: none; border-radius: var(--radius-sm); cursor: pointer; opacity: 0.7; transition: opacity 0.2s ease, background-color 0.2s ease; } .nych-message-closeButton:hover { opacity: 1; background-color: rgba(128, 128, 128, 0.18); } .nych-message-closeIcon { width: 12px; height: 12px; } .nych-message[data-p~='info'] { background-color: color-mix(in srgb, var(--info) 15%, var(--surface-1)); border-color: color-mix(in srgb, var(--info) 30%, var(--border)); border-left-color: var(--info); } .nych-message[data-p~='info'] .nych-message-icon { color: var(--info); } .nych-message[data-p~='success'] { background-color: color-mix(in srgb, var(--success) 15%, var(--surface-1)); border-color: color-mix(in srgb, var(--success) 30%, var(--border)); border-left-color: var(--success); } .nych-message[data-p~='success'] .nych-message-icon { color: var(--success); } .nych-message[data-p~='warn'] { background-color: color-mix(in srgb, var(--warn) 16%, var(--surface-1)); border-color: color-mix(in srgb, var(--warn) 32%, var(--border)); border-left-color: var(--warn); } .nych-message[data-p~='warn'] .nych-message-icon { color: var(--warn); } .nych-message[data-p~='error'] { background-color: color-mix(in srgb, var(--danger) 20%, var(--surface-1)); border-color: color-mix(in srgb, var(--danger) 38%, var(--border)); border-left-color: var(--danger); } .nych-message[data-p~='error'] .nych-message-icon { color: var(--danger); } .nych-message[data-p~='secondary'] { background-color: var(--surface-2); border-left-color: var(--neutral); } /* ============================================================ Tag ============================================================ */ .nych-tag { display: inline-flex; align-items: center; gap: 4px; padding: 3px 8px; font-size: 0.8rem; font-weight: 600; letter-spacing: 0.03em; line-height: 1; border-radius: var(--radius-sm); background-color: var(--primary); color: var(--primary-fg); } .nych-tag[data-p~='rounded'] { border-radius: var(--radius-full); } .nych-tag-icon { width: 12px; height: 12px; } .nych-tag[data-p~='secondary'] { background-color: var(--neutral); color: var(--neutral-fg); } .nych-tag[data-p~='info'] { background-color: var(--info); color: var(--info-fg); } .nych-tag[data-p~='success'] { background-color: var(--success); color: var(--success-fg); } .nych-tag[data-p~='warn'] { background-color: var(--warn); color: var(--warn-fg); } .nych-tag[data-p~='danger'] { background-color: var(--danger); color: var(--danger-fg); } .nych-tag[data-p~='contrast'] { background-color: var(--text-high); color: var(--surface-0); } /* ============================================================ Dialog ============================================================ */ .nych-dialog-mask { position: fixed; inset: 0; display: flex; align-items: center; justify-content: center; padding: 1rem; background-color: rgba(0, 0, 0, 0.55); } .nych-dialog { display: flex; flex-direction: column; max-width: 92vw; max-height: 90vh; color: var(--text-body); background-color: var(--surface-1); border: 1px solid var(--border); border-radius: var(--radius-2xl); box-shadow: var(--shadow-dialog); overflow: hidden; } .nych-dialog-header { display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 16px 20px; border-bottom: 1px solid var(--border-lo); } .nych-dialog-title { font-family: var(--font-serif); font-size: 1.3rem; letter-spacing: 0.02em; color: var(--text-high); } .nych-dialog-headerActions { display: flex; align-items: center; gap: 4px; } .nych-dialog-headerActions button { display: flex; align-items: center; justify-content: center; width: 30px; height: 30px; padding: 0; color: var(--text-muted); background: transparent; border: none; border-radius: var(--radius-lg); cursor: pointer; transition: background-color 0.2s ease, color 0.2s ease; } .nych-dialog-headerActions button:hover { color: var(--text-high); background-color: var(--surface-3); } .nych-dialog-headerActions button svg { width: 14px; height: 14px; } .nych-dialog-content { font-family: var(--font-sans); padding: 20px; line-height: 1.6; overflow-y: auto; } .nych-dialog-footer { display: flex; justify-content: flex-end; gap: 8px; padding: 16px 20px; border-top: 1px solid var(--border-lo); } /* ============================================================ LaurelDivider ============================================================ */ /* Horizontal (default): full-width running laurel SVG */ .nych-divider { display: block; width: 100%; color: var(--primary); } /* Label variant: flanking thin lines + centered text */ .nych-divider[data-p~='label'] { display: flex; align-items: center; gap: 12px; } .nych-divider[data-p~='label']::before, .nych-divider[data-p~='label']::after { content: ''; flex: 1; height: 1px; background: var(--border); } .nych-divider-label { font-family: var(--font-serif); font-size: 0.72rem; letter-spacing: 0.16em; text-transform: uppercase; color: var(--text-dim); white-space: nowrap; } /* Vertical variant */ .nych-divider--vertical { display: flex; flex-direction: column; align-items: center; height: 100%; width: auto; gap: 10px; color: var(--primary); } .nych-divider--vertical::before, .nych-divider--vertical::after { content: ''; width: 1px; flex: 1; background: var(--border); }