@24vlh/vds 0.1.1 → 0.1.3

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.
Files changed (35) hide show
  1. package/dist/components/accordion.css +170 -1
  2. package/dist/components/authoring.css +332 -1
  3. package/dist/components/buttons.css +683 -1
  4. package/dist/components/charts.css +502 -1
  5. package/dist/components/command.css +521 -1
  6. package/dist/components/content-blocks.css +944 -1
  7. package/dist/components/doc-block.css +782 -1
  8. package/dist/components/feedback.css +657 -1
  9. package/dist/components/flows.css +1101 -1
  10. package/dist/components/forms-advanced.css +462 -1
  11. package/dist/components/forms.css +627 -1
  12. package/dist/components/forms.min.css +1 -1
  13. package/dist/components/header-footer.css +348 -1
  14. package/dist/components/hero.css +498 -1
  15. package/dist/components/icons.css +937 -1
  16. package/dist/components/icons.min.css +1 -1
  17. package/dist/components/navigation.css +900 -1
  18. package/dist/components/overlays.css +498 -1
  19. package/dist/components/sections.css +450 -1
  20. package/dist/components/skeleton.css +385 -1
  21. package/dist/components/tables.css +591 -1
  22. package/dist/components/tabs.css +307 -1
  23. package/dist/components/toasts.css +421 -1
  24. package/dist/components/tooltips-popovers.css +447 -1
  25. package/dist/components/typography.css +250 -1
  26. package/dist/components/utilities.css +3434 -1
  27. package/dist/core.css +866 -1
  28. package/dist/identity.css +266 -1
  29. package/dist/themes/carbon.css +658 -1
  30. package/dist/themes/graphite.css +658 -1
  31. package/dist/themes/navy.css +657 -1
  32. package/dist/themes/slate.css +659 -1
  33. package/dist/vds.css +19010 -1
  34. package/dist/vds.min.css +1 -1
  35. package/package.json +3 -2
@@ -1 +1,627 @@
1
- .vds-form,[data-vds-form]{--form-flow-gap-xs:var(--space-1);--form-flow-textarea-min-height:5rem;--size-9:2.75rem;--size-10:3.00rem;--size-11:3.25rem;--control-min-height:var(--size-10);--control-height-md:40px}.vds-form .form--a .form-control,[data-vds-form] .form--a .form-control{--control-min-height:var(--size-11)}.vds-form .form--c .form-control,[data-vds-form] .form--c .form-control{--control-min-height:var(--size-9)}button,input,select,textarea{color:inherit;font-family:inherit;font-size:100%;line-height:inherit}input,select,textarea{background-clip:padding-box}input:focus,select:focus,textarea:focus{outline:none}.form--a .input,.form--a .select,.form--a .textarea{font-size:var(--text-md);padding:var(--space-4)}.form--a .form-check{font-size:var(--text-md)}.form--a .segmented__option{font-size:var(--text-md);padding:var(--space-3) var(--space-5)}.form--a .file-upload__control{padding:var(--space-5)}.form--c .input,.form--c .select,.form--c .textarea{font-size:var(--text-xs);padding:var(--space-2)}.form--c .form-check{font-size:var(--text-xs)}.form--c .segmented__option{font-size:var(--text-xs);padding:var(--space-1) var(--space-3)}.form--c .file-upload__control{padding:var(--space-3)}.form-field{display:flex;flex-direction:column;gap:var(--form-flow-gap-xs);width:100%}.form-field--disabled{opacity:.7;pointer-events:none}.form-label{color:var(--color-text);font-weight:500}.form-label--required:after{color:var(--color-danger);content:" *";font-weight:600}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration,input[type=search]::-webkit-search-results-button{-webkit-appearance:none;appearance:none}.form-label--sr-only{clip:rect(0,0,0,0);border:0;height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.form-help{color:var(--color-text-muted)}.form-error,.form-help{font-size:var(--text-xs)}.form-error,.form-field--error .form-label{color:var(--color-danger)}.form-field--error .input,.form-field--error .input-group,.form-field--error .segmented,.form-field--error .select,.form-field--error .textarea{border-color:var(--color-danger)}.form-field--error .slider{box-shadow:0 0 0 var(--border-width-strong) var(--color-danger-soft)}.form-field--error .file-upload__control{background-color:var(--color-danger-soft);border-color:var(--color-danger)}.input{background-color:var(--color-surface);border:var(--border-width) solid var(--color-border-subtle);border-radius:var(--radius-md);color:var(--color-text);padding:var(--space-3) var(--space-3);transition:border-color .2s,background-color .2s,box-shadow .2s;width:100%}.input:focus{border-color:var(--color-accent)}.input:focus-visible{border-color:var(--focus-ring-color);box-shadow:0 0 0 var(--border-width-strong) var(--focus-ring-color)}.input:hover{border-color:var(--color-border-strong)}.input--disabled,.input:disabled{background-color:var(--color-muted-bg);color:var(--color-text-muted);cursor:not-allowed}.input--readonly,.input[readonly]{background-color:var(--color-surface-subtle);border-style:dashed;color:var(--color-text-muted)}.input::-moz-placeholder{color:var(--color-placeholder);opacity:1}.input::placeholder{color:var(--color-placeholder);opacity:1}.input-icon{align-items:center;display:flex;position:relative;width:100%}.input-icon .input{width:100%}.input-icon--left .input{padding-left:var(--space-8)}.input-icon--both .input,.input-icon--right .input{padding-right:var(--space-8)}.input-icon--both .input{padding-left:var(--space-8)}.input-icon__icon{align-items:center;color:var(--color-text-muted);display:inline-flex;height:var(--icon-sm);justify-content:center;position:absolute;top:50%;transform:translateY(-50%);width:var(--icon-sm)}.input-icon--left .input-icon__icon{left:var(--space-3)}.input-icon--right .input-icon__icon{right:var(--space-3)}.textarea{background-color:var(--color-surface);border:var(--border-width) solid var(--color-border-subtle);border-radius:var(--radius-md);color:var(--color-text);min-height:var(--form-flow-textarea-min-height);padding:var(--space-3);resize:vertical;transition:border-color .2s,background-color .2s,box-shadow .2s;width:100%}.textarea:focus{border-color:var(--color-accent)}.textarea:focus-visible{border-color:var(--focus-ring-color);box-shadow:0 0 0 var(--border-width-strong) var(--focus-ring-color)}.textarea:hover{border-color:var(--color-border-strong)}.textarea--disabled,.textarea:disabled{background-color:var(--color-muted-bg);color:var(--color-text-muted);cursor:not-allowed}.textarea--readonly,.textarea[readonly]{background-color:var(--color-surface-subtle);border-style:dashed;color:var(--color-text-muted)}.textarea::-moz-placeholder{color:var(--color-placeholder);opacity:1}.textarea::placeholder{color:var(--color-placeholder);opacity:1}.select{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:var(--color-surface);background-image:linear-gradient(45deg,transparent 50%,var(--color-text-muted) 50%),linear-gradient(135deg,var(--color-text-muted) 50%,transparent 50%);background-position:calc(100% - var(--space-3)),calc(100% - var(--space-2));background-repeat:no-repeat;background-size:.4rem .4rem;border:var(--border-width) solid var(--color-border-subtle);border-radius:var(--radius-md);color:var(--color-text);padding:var(--space-3) var(--space-4) var(--space-3) var(--space-3);padding-right:var(--space-6);position:relative;transition:border-color .2s,background-color .2s,box-shadow .2s;width:100%}.select:focus{border-color:var(--color-accent)}.select:focus-visible{border-color:var(--focus-ring-color);box-shadow:0 0 0 var(--border-width-strong) var(--focus-ring-color)}.select:hover{border-color:var(--color-border-strong)}.select--disabled,.select:disabled{background-color:var(--color-muted-bg);background-image:linear-gradient(45deg,transparent 50%,var(--color-text-muted) 50%),linear-gradient(135deg,var(--color-text-muted) 50%,transparent 50%);color:var(--color-text-muted);cursor:not-allowed}.form-check{align-items:center;cursor:pointer;display:flex;font-size:var(--text-sm);gap:var(--space-2);margin-bottom:var(--space-3)}.form-check-group .form-check:last-child{margin-bottom:0}.form-check--disabled{cursor:not-allowed;opacity:.7}.form-check input{cursor:pointer;height:1.15rem;width:1.15rem}.checkbox{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:var(--color-surface);border:var(--border-width) solid var(--color-border-subtle);border-radius:var(--radius-sm);cursor:pointer;position:relative;transition:border-color .2s,background-color .2s,box-shadow .2s}.checkbox:hover{border-color:var(--color-border-strong)}.checkbox:focus-visible{box-shadow:0 0 0 var(--border-width-strong) var(--focus-ring-color);outline:none}.checkbox:checked{background-color:var(--color-accent-soft);border-color:var(--color-accent)}.checkbox:checked:after{background-color:var(--color-accent);content:"";height:.55rem;left:50%;-webkit-mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='16' height='16' stroke='%23fff' stroke-width='2' stroke-linecap='round' stroke-linejoin='round' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='m3 8 4 4 6-8'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='16' height='16' stroke='%23fff' stroke-width='2' stroke-linecap='round' stroke-linejoin='round' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='m3 8 4 4 6-8'/%3E%3C/svg%3E");-webkit-mask-size:cover;mask-size:cover;position:absolute;top:50%;transform:translate(-50%,-50%);width:.55rem}.checkbox:disabled{background-color:var(--color-muted-bg);border-color:var(--color-muted-border);cursor:not-allowed}.checkbox--error{border-color:var(--color-danger)}.checkbox--warning{border-color:var(--color-warning)}.checkbox--success{border-color:var(--color-success)}.checkbox--info{border-color:var(--color-info)}.radio{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:var(--color-surface);border:var(--border-width) solid var(--color-border-subtle);border-radius:50%;cursor:pointer;position:relative;transition:border-color .2s,background-color .2s,box-shadow .2s}.radio:hover{border-color:var(--color-border-strong)}.radio:focus-visible{box-shadow:0 0 0 var(--border-width-strong) var(--focus-ring-color);outline:none}.radio:checked{background-color:var(--color-accent-soft);border-color:var(--color-accent)}.radio:checked:after{background-color:var(--color-accent);border-radius:50%;content:"";height:.55rem;left:50%;position:absolute;top:50%;transform:translate(-50%,-50%);width:.55rem}.radio:disabled{background-color:var(--color-muted-bg);border-color:var(--color-muted-border);cursor:not-allowed}.radio--error{border-color:var(--color-danger)}.radio--warning{border-color:var(--color-warning)}.radio--success{border-color:var(--color-success)}.radio--info{border-color:var(--color-info)}.switch{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:var(--color-surface);border:var(--border-width) solid var(--color-border-subtle);border-radius:50%;cursor:pointer;height:1.15rem;position:relative;transition:border-color .2s,background-color .2s,box-shadow .2s;width:1.15rem}.switch:after{background-color:var(--color-accent);border-radius:50%;content:"";height:.55rem;left:22%;opacity:0;position:absolute;top:22%;transform:translate(-50%,-50%);width:.55rem}.switch:checked{background-color:var(--color-accent-strong);border:var(--border-width) solid var(--color-accent)}.switch:checked:after{background-color:var(--color-accent);opacity:1;transform:scale(1)}.switch:disabled{cursor:not-allowed;opacity:.5}.switch:focus-visible{box-shadow:0 0 0 var(--border-width-strong) var(--focus-ring-color);outline:none}.switch--error{background-color:var(--color-danger-soft)}.switch--warning{background-color:var(--color-warning-soft)}.switch--success{background-color:var(--color-success-soft)}.switch--info{background-color:var(--color-info-soft)}.switch--error:checked{background-color:var(--color-danger)}.switch--warning:checked{background-color:var(--color-warning)}.switch--success:checked{background-color:var(--color-success)}.switch--info:checked{background-color:var(--color-info)}.input-group{align-items:center;background-color:var(--color-surface);border:var(--border-width) solid var(--color-border-subtle);border-radius:var(--radius-md);display:flex;overflow:hidden}.input-group .input{border:none;box-shadow:none;flex:1}.input-group-addon{align-items:center;background-color:var(--color-surface);border-right:var(--border-width) solid var(--color-border-subtle);color:var(--color-text-muted);display:flex;padding:0 var(--space-3)}.input-group-addon+.input{padding-left:var(--space-2)}.input-group-icon{align-items:center;color:var(--color-text-muted);display:flex;padding:0 var(--space-3)}.input-group-icon .icon{height:var(--icon-sm);width:var(--icon-sm)}.input-group--error{border-color:var(--color-danger)}.input-group--warning{border-color:var(--color-warning)}.input-group--success{border-color:var(--color-success)}.input-group--info{border-color:var(--color-info)}.input-group--disabled{opacity:.7;pointer-events:none}.input-group:focus-within{border-color:var(--focus-ring-color);box-shadow:0 0 0 var(--border-width-strong) var(--focus-ring-color)}.input-group:hover{border-color:var(--color-border-strong)}.segmented{background-color:var(--color-surface);border:var(--border-width) solid var(--color-border-subtle);border-radius:var(--radius-md);display:flex;height:2.5rem;height:var(--control-height-md,2.5rem);overflow:hidden;width:100%}.segmented__option{align-items:center;-webkit-appearance:none;-moz-appearance:none;appearance:none;background:var(--color-surface);border:none;color:var(--color-text-muted);cursor:pointer;display:inline-flex;flex:1 1 0;font:inherit;height:100%;justify-content:center;line-height:inherit;padding:var(--space-2) var(--space-4);text-align:center;transition:background-color .2s,color .2s;-webkit-user-select:none;-moz-user-select:none;user-select:none}.segmented__option:not(:last-child){border-right:var(--border-width) solid var(--color-border-subtle)}.segmented__option:hover{background-color:var(--color-surface-subtle);color:var(--color-text)}.segmented__option:focus-visible{box-shadow:inset 0 0 0 var(--border-width-strong) var(--focus-ring-color);outline:none}.segmented__option--active{background-color:var(--color-accent);color:var(--color-on-accent);font-weight:600;position:relative;z-index:1}.segmented__option--active+.segmented__option{border-left-color:transparent}.segmented--disabled{opacity:.6;pointer-events:none}.segmented__option--disabled{cursor:not-allowed;opacity:.7}.segmented__option-icon{height:var(--icon-sm);margin-right:var(--space-2);width:var(--icon-sm)}.segmented--error{border-color:var(--color-danger)}.segmented--warning{border-color:var(--color-warning)}.segmented--success{border-color:var(--color-success)}.segmented--info{border-color:var(--color-info)}.segmented--loading .segmented__option{overflow:hidden;position:relative}.segmented--loading .segmented__option:after{animation:input-loading-shimmer 1.5s infinite;background-image:linear-gradient(90deg,var(--color-muted-bg),var(--color-surface),var(--color-muted-bg));background-size:200% 100%;bottom:0;content:"";left:0;position:absolute;right:0;top:0}.slider{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:var(--slider-track-bg);border-radius:var(--radius-sm);cursor:pointer;height:var(--border-width-strong);width:100%}.slider:focus-visible{box-shadow:0 0 0 var(--border-width-strong) var(--focus-ring-color);outline:none}.slider:disabled{cursor:not-allowed;opacity:.7}.slider::-webkit-slider-thumb{-webkit-appearance:none;appearance:none;background:var(--slider-thumb-bg);border-radius:50%;cursor:pointer;height:1rem;width:1rem}.slider::-moz-range-thumb{background:var(--slider-thumb-bg);border-radius:50%;cursor:pointer;height:1rem;width:1rem}.slider--error{box-shadow:0 0 0 var(--border-width-strong) var(--color-danger-soft)}.slider--error:focus-visible{box-shadow:0 0 0 var(--border-width-strong) var(--color-danger);outline:none}.slider--warning{box-shadow:0 0 0 var(--border-width-strong) var(--color-warning-soft)}.slider--warning:focus-visible{box-shadow:0 0 0 var(--border-width-strong) var(--color-warning);outline:none}.slider--success{box-shadow:0 0 0 var(--border-width-strong) var(--color-success-soft)}.slider--success:focus-visible{box-shadow:0 0 0 var(--border-width-strong) var(--color-success);outline:none}.slider--info{box-shadow:0 0 0 var(--border-width-strong) var(--color-info-soft)}.slider--info:focus-visible{box-shadow:0 0 0 var(--border-width-strong) var(--color-info);outline:none}.file-upload input{clip:rect(0,0,0,0);border:0;height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;white-space:nowrap;width:1px}.file-upload__control{background-color:var(--color-surface);border:var(--border-width) dashed var(--color-border-subtle);border-radius:var(--radius-md);color:var(--color-text-soft);cursor:pointer;padding:var(--space-4);text-align:center;transition:border-color .2s,background-color .2s,box-shadow .2s}.file-upload__control:hover{background-color:var(--color-surface-subtle);border-color:var(--color-border-strong)}.file-upload__control:focus-visible{box-shadow:0 0 0 var(--border-width-strong) var(--focus-ring-color);outline:none}.file-upload__control--dragover{background-color:var(--color-accent-soft);border-color:var(--color-accent)}.file-upload__control--disabled{cursor:not-allowed;opacity:.7}.file-upload__control--error{background-color:var(--color-danger-soft);border-color:var(--color-danger);color:var(--color-danger-strong)}.file-upload__control--warning{background-color:var(--color-warning-soft);border-color:var(--color-warning);color:var(--color-warning-strong)}.file-upload__control--success{background-color:var(--color-success-soft);border-color:var(--color-success);color:var(--color-success-strong)}.file-upload__control--info{background-color:var(--color-info-soft);border-color:var(--color-info);color:var(--color-info-strong)}.file-upload__control--loading{animation:input-loading-shimmer 1.5s infinite;background-image:linear-gradient(90deg,var(--color-muted-bg),var(--color-surface),var(--color-muted-bg));background-size:200% 100%}.form-row{display:flex;flex-wrap:wrap;gap:var(--space-4)}.form-row--two{grid-template-columns:repeat(2,minmax(0,1fr))}.form-grid,.form-row--two{grid-gap:var(--space-4);display:grid;gap:var(--space-4)}.form-grid--two{grid-template-columns:repeat(2,minmax(0,1fr))}.form-grid--three{grid-template-columns:repeat(3,minmax(0,1fr))}.form-grid--four{grid-template-columns:repeat(4,minmax(0,1fr))}@media (max-width:768px){.form-grid--four,.form-grid--three,.form-grid--two{grid-template-columns:1fr}}.input--error,.select--error,.textarea--error{border-color:var(--color-danger)}.input--error:focus-visible,.select--error:focus-visible,.textarea--error:focus-visible{box-shadow:0 0 0 var(--border-width-strong) var(--color-danger-soft)}.input--success,.select--success,.textarea--success{border-color:var(--color-success)}.input--success:focus-visible,.select--success:focus-visible,.textarea--success:focus-visible{box-shadow:0 0 0 var(--border-width-strong) var(--color-success-soft)}.input--warning,.select--warning,.textarea--warning{border-color:var(--color-warning)}.input--warning:focus-visible,.select--warning:focus-visible,.textarea--warning:focus-visible{box-shadow:0 0 0 var(--border-width-strong) var(--color-warning-soft)}.input--info,.select--info,.textarea--info{border-color:var(--color-info)}.input--info:focus-visible,.select--info:focus-visible,.textarea--info:focus-visible{box-shadow:0 0 0 var(--border-width-strong) var(--color-info-soft)}.form-meta{align-items:flex-start;display:flex;gap:var(--form-flow-gap-xs);justify-content:space-between;margin-top:var(--space-1)}.form-meta--stacked{align-items:flex-start;flex-direction:column}.form-meta--inline{align-items:center;flex-direction:row}.form-meta__messages{display:flex;flex-direction:column;gap:var(--space-1);min-width:0}.form-counter{color:var(--color-text-muted);font-family:var(--font-family-mono),monospace;font-size:var(--text-xs);margin-left:auto;white-space:nowrap}.form-counter--warning{color:var(--color-warning)}.form-counter--danger,.form-field--error .form-counter{color:var(--color-danger)}.form-control-with-icon{display:inline-flex;position:relative;width:100%}.form-control-with-icon .input,.form-control-with-icon .select,.form-control-with-icon .textarea{padding-right:calc(var(--space-8) + var(--space-1));width:100%}.form-status-icon{align-items:center;color:var(--color-text-muted);display:inline-flex;height:var(--icon-sm);justify-content:center;pointer-events:none;position:absolute;right:var(--space-3);top:50%;transform:translateY(-50%);width:var(--icon-sm)}.form-field--error .form-status-icon{color:var(--color-danger)}.form-field--success .form-status-icon{color:var(--color-success)}.form-field--warning .form-status-icon{color:var(--color-warning)}.form-field--info .form-status-icon{color:var(--color-info)}.form-field--success .form-label{color:var(--color-success)}.form-field--success .input,.form-field--success .input-group,.form-field--success .select,.form-field--success .textarea{border-color:var(--color-success)}.form-field--warning .form-label{color:var(--color-warning)}.form-field--warning .input,.form-field--warning .input-group,.form-field--warning .select,.form-field--warning .textarea{border-color:var(--color-warning)}.form-field--info .form-label{color:var(--color-info)}.form-field--info .input,.form-field--info .input-group,.form-field--info .select,.form-field--info .textarea{border-color:var(--color-info)}.form-field--horizontal{grid-column-gap:var(--space-4);align-items:flex-start;-moz-column-gap:var(--space-4);column-gap:var(--space-4);display:grid;grid-template-columns:minmax(0,12rem) minmax(0,1fr)}.form-field__label{padding-top:var(--space-1)}.form-field__control{display:flex;flex-direction:column;gap:var(--form-flow-gap-xs)}@media (max-width:768px){.form-field--horizontal{grid-template-columns:1fr}.form-field__label{padding-top:0}}.input--loading,.select--loading,.textarea--loading{animation:input-loading-shimmer 1.5s infinite;background-image:linear-gradient(90deg,var(--color-muted-bg),var(--color-surface),var(--color-muted-bg));background-size:200% 100%}@keyframes input-loading-shimmer{0%{background-position:-150% 0}to{background-position:150% 0}}.modal .form-field{margin-bottom:var(--space-3)}.form-message{align-items:flex-start;background-color:var(--color-surface-subtle);border:var(--border-width) solid var(--color-border-subtle);border-radius:var(--radius-md);display:flex;font-size:var(--text-sm);gap:var(--space-3);padding:var(--space-4) var(--space-6);width:100%}.form-message__icon{stroke:currentColor;fill:none;flex-shrink:0;height:1.25rem;width:1.25rem}.form-message__content{display:flex;flex-direction:column;gap:var(--space-1)}.form-message--neutral{background-color:var(--color-muted-bg);border-color:var(--color-muted-border);color:var(--color-text-muted)}.form-message--error{background-color:var(--semantic-error-bg-strong,var(--color-danger-soft));border-color:var(--semantic-error-border-strong,var(--color-danger));color:var(--semantic-error-text-strong,var(--color-danger-strong))}.form-message--info{background-color:var(--semantic-info-bg-strong,var(--color-info-soft));border-color:var(--semantic-info-border-strong,var(--color-info));color:var(--semantic-info-text-strong,var(--color-info-strong))}.form-message--success{background-color:var(--semantic-success-bg-strong,var(--color-success-soft));border-color:var(--semantic-success-border-strong,var(--color-success));color:var(--semantic-success-text-strong,var(--color-success-strong))}.form-message--warning{background-color:var(--semantic-warning-bg-strong,var(--color-warning-soft));border-color:var(--semantic-warning-border-strong,var(--color-warning));color:var(--semantic-warning-text-strong,var(--color-warning-strong))}.form-field-message{align-items:center;display:flex;font-size:var(--text-xs);gap:var(--space-1);margin-top:var(--space-1)}.form-field-message--neutral{color:var(--color-text-muted)}.form-field-message--error{color:var(--semantic-error-text-strong,var(--color-danger-strong))}.form-field-message--warning{color:var(--semantic-warning-text-strong,var(--color-warning-strong))}.form-field-message--info{color:var(--semantic-info-text-strong,var(--color-info-strong))}.form-field-message--success{color:var(--semantic-success-text-strong,var(--color-success-strong))}.form-field-message__icon{stroke:currentColor;fill:none;flex-shrink:0;height:1rem;width:1rem}.form-check-inline{align-items:center;cursor:pointer;display:inline-flex;gap:var(--space-2);margin-right:var(--space-6)}.form-check-group{align-items:flex-start;display:flex;flex-direction:column;gap:var(--space-1)}.form-check-group--horizontal{align-items:center;flex-direction:row;flex-wrap:wrap;gap:var(--space-6)}.form-check-group--horizontal .form-check{margin-bottom:var(--space-2);margin-right:var(--space-6)}.form-section--error{background-color:transparent;background-color:var(--semantic-error-bg-strong,transparent);border-left:var(--border-width-strong) solid var(--semantic-error-border-strong,var(--color-danger));padding:var(--space-3)}.form-section--warning{background-color:transparent;background-color:var(--semantic-warning-bg-strong,transparent);border-left:var(--border-width-strong) solid var(--semantic-warning-border-strong,var(--color-warning));padding:var(--space-3)}.form-section--success{background-color:transparent;background-color:var(--semantic-success-bg-strong,transparent);border-left:var(--border-width-strong) solid var(--semantic-success-border-strong,var(--color-success));padding:var(--space-3)}.form-section--info{background-color:transparent;background-color:var(--semantic-info-bg-strong,transparent);border-left:var(--border-width-strong) solid var(--semantic-info-border-strong,var(--color-info));padding:var(--space-3)}.form-section--error:not(:last-child),.form-section--info:not(:last-child),.form-section--success:not(:last-child),.form-section--warning:not(:last-child){margin-bottom:var(--space-4)}.input[aria-invalid=true],.select[aria-invalid=true],.textarea[aria-invalid=true]{border-color:var(--color-danger)}.input[aria-invalid=true]:focus-visible,.select[aria-invalid=true]:focus-visible,.textarea[aria-invalid=true]:focus-visible{box-shadow:0 0 0 var(--border-width-strong) var(--color-danger-soft)}.form-control{box-sizing:border-box;display:block;margin:0;min-height:var(--control-min-height);width:100%}.form-control-wrapper{align-items:center;display:flex;position:relative;width:100%}.form-control-wrapper>.form-control{flex:1 1 auto}.form-control--loading{cursor:progress;opacity:.55;pointer-events:none}.form-control--disabled{opacity:.45;pointer-events:none}.form-control--readonly{cursor:default;opacity:.75}.form-control--error{box-shadow:0 0 0 var(--border-width-strong) var(--color-danger)}.form-control--warning{box-shadow:0 0 0 var(--border-width-strong) var(--color-warning)}.form-control--success{box-shadow:0 0 0 var(--border-width-strong) var(--color-success)}.form-control--info{box-shadow:0 0 0 var(--border-width-strong) var(--color-info)}.form-control--password,.form-control-wrapper[data-icon=right] .form-control--password{padding-right:calc(var(--space-8) + var(--space-2))}.form-control--password:focus{border-color:var(--color-accent)}.form-control--password::-moz-placeholder{color:var(--color-placeholder)}.form-control--password::placeholder{color:var(--color-placeholder)}.form-control-wrapper[data-icon=left] .form-control{padding-left:calc(var(--space-7) + var(--space-2))}.form-control-wrapper[data-icon=left] .form-control-icon{align-items:center;display:flex;left:var(--space-2);position:absolute}.form-control-wrapper[data-icon=right] .form-control{padding-right:calc(var(--space-7) + var(--space-2))}.form-control-wrapper[data-icon=right] .form-control-icon{align-items:center;display:flex;position:absolute;right:var(--space-2)}.form-control-icon{color:var(--color-text-muted);font-size:var(--text-md);pointer-events:none}.form-control--loading:after{animation:formControlLoading 1.5s ease-in-out infinite;background:var(--color-surface-subtle);border-radius:inherit;bottom:0;content:"";left:0;position:absolute;right:0;top:0}@keyframes formControlLoading{0%{opacity:.35}50%{opacity:.6}to{opacity:.35}}.form-control--file{background-color:var(--color-surface);border:var(--border-width) dashed var(--color-border-subtle);border-radius:var(--radius-md);color:var(--color-text-muted);cursor:pointer;padding:var(--space-3);position:relative;transition:border-color .2s,background-color .2s}.form-control--file[type=file]{background:none;border:none;opacity:1;padding:0;position:static}.form-control-file-surface{align-items:center;background-color:var(--color-surface);border:var(--border-width) dashed var(--color-border-subtle);border-radius:var(--radius-md);cursor:pointer;display:flex;flex-direction:column;gap:var(--space-2);justify-content:center;padding:var(--space-6);position:relative;transition:border-color .2s,background-color .2s}.form-control-file-surface input[type=file]{bottom:0;cursor:pointer;left:0;opacity:0;position:absolute;right:0;top:0}.form-control-file-surface:hover{background-color:var(--color-surface-subtle);border-color:var(--color-border-strong)}.form-control-file-surface--dragover{background-color:var(--color-accent-soft);border-color:var(--color-accent)}.form-control-file-surface--disabled{cursor:not-allowed;opacity:.65}.form-control-file-surface--error{background-color:var(--color-danger-soft);border-color:var(--color-danger)}.form-control-file-surface--warning{background-color:var(--color-warning-soft);border-color:var(--color-warning)}.form-control-file-surface--success{background-color:var(--color-success-soft);border-color:var(--color-success)}.form-control-file-surface--info{background-color:var(--color-info-soft);border-color:var(--color-info)}.file-upload-inline{align-items:center;display:inline-flex;gap:var(--space-2)}.file-upload-inline__input{clip:rect(0,0,0,0);border:0;height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;white-space:nowrap;width:1px}.file-upload-inline__label{align-items:center;cursor:pointer;display:inline-flex;justify-content:center}.file-upload,.file-upload *{box-sizing:border-box}.file-upload{display:flex;flex-direction:column;gap:var(--space-2);width:100%}.form-control-file-surface.form-control--loading:after{animation:input-loading-shimmer 1.5s infinite;background-image:linear-gradient(90deg,var(--color-muted-bg),var(--color-surface),var(--color-muted-bg));background-size:200% 100%;border-radius:inherit;bottom:0;content:"";left:0;position:absolute;right:0;top:0}.form-control-file-icon{color:var(--color-text-muted);font-size:var(--text-lg)}.form-control-file-label{color:var(--color-text);font-size:var(--text-sm)}.form-control-file-hint{color:var(--color-text-muted);font-size:var(--text-xs)}.form-control--error:focus-visible,.input[aria-invalid=true]:focus-visible,.select[aria-invalid=true]:focus-visible,.slider--error:focus-visible,.textarea[aria-invalid=true]:focus-visible{box-shadow:0 0 0 var(--border-width-strong) var(--semantic-error-border-strong,var(--color-danger))}.checkbox:checked,.radio:checked,.switch:checked{background-color:var(--accent-soft-surface,var(--color-accent-soft));border-color:var(--accent-soft-border,var(--color-accent));box-shadow:0 0 0 1px transparent;box-shadow:0 0 0 1px var(--accent-soft-shadow,transparent);color:var(--accent-soft-on,var(--color-on-accent))}.checkbox:checked:after,.radio:checked:after,.switch:checked:after{background-color:var(--accent-soft-border,var(--color-accent))}.checkbox:checked:hover,.radio:checked:hover,.switch:checked:hover{background-color:var(--accent-soft-surface-strong,var(--accent-soft-surface));border-color:var(--accent-soft-border,var(--color-accent))}.checkbox:checked:disabled,.radio:checked:disabled,.switch:checked:disabled{background-color:var(--color-surface-subtle);border-color:var(--color-border-subtle);opacity:.6}
1
+ /************************************************************
2
+ * VLAH DESIGN SYSTEM (VDS) - Forms (UFAL)
3
+ *
4
+ * Responsibilities:
5
+ * - Provide the Unified Form Abstraction Layer (UFAL)
6
+ * - Define a single, token-driven form system:
7
+ * controls, wrappers, icons, prefixes/suffixes,
8
+ * semantic states, file surfaces, layout primitives,
9
+ * and form-level messaging
10
+ *
11
+ * System Notes:
12
+ * - Token-driven (spacing, radii, borders, typography, motion)
13
+ * - No JS assumptions; JS may toggle state classes only
14
+ * - UFAL is the sole form system in the VDS library
15
+ ************************************************************/
16
+
17
+ /* ---------------------------------------------------------
18
+ 1. TOKENS & SHARED ANIMATIONS
19
+ --------------------------------------------------------- */
20
+
21
+ [data-vds-form],
22
+ .vds-form {
23
+ --form-flow-textarea-min-height: 5rem;
24
+ --size-10: 3.00rem;
25
+ --control-min-height: var(--size-10);
26
+ }
27
+
28
+ @keyframes input-loading-shimmer {
29
+ 0% {
30
+ background-position: -150% 0;
31
+ }
32
+ 100% {
33
+ background-position: 150% 0;
34
+ }
35
+ }
36
+
37
+ /* ---------------------------------------------------------
38
+ 2. BASE CONTROL PRIMITIVE
39
+ --------------------------------------------------------- */
40
+
41
+ .form-control {
42
+ position: relative;
43
+ z-index: 0;
44
+ display: block;
45
+ width: 100%;
46
+ min-height: var(--control-min-height);
47
+
48
+ margin: 0;
49
+ box-sizing: border-box;
50
+
51
+ padding: var(--space-3);
52
+ border: var(--border-width) solid var(--color-border-subtle);
53
+ border-radius: var(--radius-md);
54
+ background-color: var(--color-surface);
55
+ color: var(--color-text);
56
+
57
+ transition: border-color .2s, background-color .2s, box-shadow .2s;
58
+ }
59
+
60
+ /* Native control normalization (only when used as UFAL control) */
61
+
62
+ input.form-control,
63
+ select.form-control,
64
+ textarea.form-control {
65
+ font: inherit;
66
+ line-height: inherit;
67
+ background-clip: padding-box;
68
+ }
69
+
70
+ textarea.form-control {
71
+ resize: vertical;
72
+ min-height: var(--form-flow-textarea-min-height);
73
+ }
74
+
75
+ select.form-control {
76
+ -webkit-appearance: none;
77
+ -moz-appearance: none;
78
+ appearance: none;
79
+ }
80
+
81
+ /* Select dropdown affordance */
82
+
83
+ select.form-control:not([multiple]):not([size]) {
84
+ padding-right: calc(var(--space-7) + var(--space-2));
85
+ background-image: linear-gradient(45deg, transparent 50%, var(--color-text-muted) 50%),
86
+ linear-gradient(135deg, var(--color-text-muted) 50%, transparent 50%);
87
+ background-position: calc(100% - var(--space-3)) 50%,
88
+ calc(100% - var(--space-2)) 50%;
89
+ background-size: 0.4rem 0.4rem;
90
+ background-repeat: no-repeat;
91
+ }
92
+
93
+ .form-control::-moz-placeholder {
94
+ color: var(--color-placeholder);
95
+ opacity: 1;
96
+ }
97
+
98
+ .form-control::placeholder {
99
+ color: var(--color-placeholder);
100
+ opacity: 1;
101
+ }
102
+
103
+ .form-control:hover {
104
+ border-color: var(--color-border-strong);
105
+ }
106
+
107
+ .form-control:focus {
108
+ outline: none;
109
+ border-color: var(--color-accent);
110
+ }
111
+
112
+ .form-control:focus-visible {
113
+ outline: none;
114
+ border-color: var(--focus-ring-color);
115
+ box-shadow: 0 0 0 var(--border-width-strong) var(--focus-ring-color);
116
+ }
117
+
118
+ /* ARIA validation */
119
+
120
+ .form-control[aria-invalid="true"] {
121
+ border-color: var(--color-danger);
122
+ }
123
+
124
+ .form-control[aria-invalid="true"]:focus-visible {
125
+ box-shadow: 0 0 0 var(--border-width-strong) var(--color-danger-soft);
126
+ }
127
+
128
+ /* ---------------------------------------------------------
129
+ 3. WRAPPERS & GROUPING
130
+ --------------------------------------------------------- */
131
+
132
+ .form-control-wrapper {
133
+ position: relative;
134
+ width: 100%;
135
+ display: flex;
136
+ align-items: center;
137
+ }
138
+
139
+ .form-control-wrapper > .form-control {
140
+ flex: 1 1 auto;
141
+ width: auto;
142
+ }
143
+
144
+ /* ---------------------------------------------------------
145
+ 4. STATE MODIFIERS
146
+ --------------------------------------------------------- */
147
+
148
+ .form-control--loading {
149
+ cursor: progress;
150
+ opacity: .55;
151
+ pointer-events: none;
152
+ }
153
+
154
+ .form-control--disabled {
155
+ opacity: .45;
156
+ pointer-events: none;
157
+ }
158
+
159
+ .form-control--readonly {
160
+ opacity: .75;
161
+ cursor: default;
162
+ }
163
+
164
+ .form-control--error {
165
+ box-shadow: 0 0 0 var(--border-width-strong) var(--color-danger);
166
+ }
167
+
168
+ .form-control--warning {
169
+ box-shadow: 0 0 0 var(--border-width-strong) var(--color-warning);
170
+ }
171
+
172
+ .form-control--success {
173
+ box-shadow: 0 0 0 var(--border-width-strong) var(--color-success);
174
+ }
175
+
176
+ .form-control--info {
177
+ box-shadow: 0 0 0 var(--border-width-strong) var(--color-info);
178
+ }
179
+
180
+ /* Native disabled / readonly */
181
+
182
+ .form-control:disabled,
183
+ .form-control[disabled] {
184
+ background-color: var(--color-muted-bg);
185
+ color: var(--color-text-muted);
186
+ cursor: not-allowed;
187
+ }
188
+
189
+ .form-control[readonly] {
190
+ background-color: var(--color-surface-subtle);
191
+ color: var(--color-text-muted);
192
+ border-style: dashed;
193
+ }
194
+
195
+ .form-control--error:focus-visible {
196
+ box-shadow: 0 0 0 var(--border-width-strong) var(--semantic-error-border-strong, var(--color-danger));
197
+ }
198
+
199
+ /* ---------------------------------------------------------
200
+ 5. ICONS / PREFIX / SUFFIX
201
+ --------------------------------------------------------- */
202
+
203
+ .form-control-wrapper[data-icon="left"] .form-control {
204
+ padding-left: calc(var(--space-7) + var(--space-2));
205
+ }
206
+
207
+ .form-control-wrapper[data-icon="right"] .form-control {
208
+ padding-right: calc(var(--space-7) + var(--space-2));
209
+ }
210
+
211
+ .form-control-wrapper[data-icon="left"] .form-control-icon,
212
+ .form-control-wrapper[data-icon="right"] .form-control-icon {
213
+ position: absolute;
214
+ top: 50%;
215
+ transform: translateY(-50%);
216
+ display: flex;
217
+ align-items: center;
218
+ pointer-events: none;
219
+ }
220
+
221
+ .form-control-wrapper[data-icon="left"] .form-control-icon {
222
+ left: var(--space-2);
223
+ }
224
+
225
+ .form-control-wrapper[data-icon="right"] .form-control-icon {
226
+ right: var(--space-2);
227
+ }
228
+
229
+ .form-control-icon {
230
+ font-size: var(--text-md);
231
+ color: var(--color-text-muted);
232
+ }
233
+
234
+ .form-control-icon,
235
+ .form-control-prefix,
236
+ .form-control-suffix {
237
+ position: absolute;
238
+ z-index: 1;
239
+ }
240
+
241
+ /* Prefix / suffix */
242
+
243
+ .form-control-prefix,
244
+ .form-control-suffix {
245
+ position: static;
246
+ display: inline-flex;
247
+ align-items: center;
248
+ white-space: nowrap;
249
+ color: var(--color-text-muted);
250
+ font-size: var(--text-sm);
251
+ pointer-events: none;
252
+ }
253
+
254
+ .form-control-prefix {
255
+ margin-left: var(--space-3);
256
+ margin-right: var(--space-2);
257
+ }
258
+
259
+ .form-control-suffix {
260
+ margin-left: var(--space-2);
261
+ margin-right: var(--space-3);
262
+ }
263
+
264
+ /* ---------------------------------------------------------
265
+ 5A. GROUPED CONTROLS (FIXED, ORDER-INDEPENDENT)
266
+ - Group owns the outer border + radius
267
+ - Children have no outer borders (prevents double border)
268
+ - Group draws internal dividers (always present, any child type)
269
+ - Works for: .form-control, .form-control-wrapper (icons), .button
270
+ --------------------------------------------------------- */
271
+
272
+ .form-control-group {
273
+ position: relative;
274
+ display: flex;
275
+ align-items: stretch;
276
+ width: 100%;
277
+
278
+ border: var(--border-width) solid var(--color-border-subtle);
279
+ border-radius: var(--radius-md);
280
+ background-color: var(--color-surface);
281
+ }
282
+
283
+ /* Outer rounding is applied to slots, to preserve radius even when children are wrappers */
284
+
285
+ .form-control-group > * {
286
+ position: relative;
287
+ border-radius: 0;
288
+ background: transparent;
289
+ }
290
+
291
+ /* Default flex behavior: controls/wrappers flex, buttons stay auto-sized below */
292
+
293
+ .form-control-group > .form-control,
294
+ .form-control-group > .form-control-wrapper {
295
+ flex: 1 1 auto;
296
+ }
297
+
298
+ .form-control-group > .button {
299
+ flex: 0 0 auto;
300
+ }
301
+
302
+ /* Edge radii */
303
+
304
+ .form-control-group > :first-child {
305
+ border-top-left-radius: var(--radius-md);
306
+ border-bottom-left-radius: var(--radius-md);
307
+ }
308
+
309
+ .form-control-group > :last-child {
310
+ border-top-right-radius: var(--radius-md);
311
+ border-bottom-right-radius: var(--radius-md);
312
+ }
313
+
314
+ /* Internal divider (single source of truth) */
315
+
316
+ .form-control-group > * + * {
317
+ box-shadow: inset var(--border-width) 0 0 var(--color-border-subtle);
318
+ }
319
+
320
+ /* Suppress per-control focus ring inside groups (prevents double focus visuals) */
321
+
322
+ .form-control-group .form-control:focus-visible {
323
+ border-color: var(--focus-ring-color);
324
+ box-shadow: inset var(--border-width) 0 0 var(--color-border-subtle),
325
+ 0 0 0 var(--border-width-strong) var(--focus-ring-color);
326
+ }
327
+
328
+ /* Children inside group should not draw their own outer borders */
329
+
330
+ .form-control-group > .form-control,
331
+ .form-control-group > .form-control-wrapper > .form-control {
332
+ border: none;
333
+ background: transparent;
334
+ }
335
+
336
+ /* Action button integration inside groups */
337
+
338
+ .form-control-group > .button {
339
+ border: none;
340
+ background: transparent;
341
+ color: var(--color-text);
342
+
343
+ height: var(--control-min-height);
344
+ line-height: 1;
345
+ display: inline-flex;
346
+ align-items: center;
347
+ justify-content: center;
348
+
349
+ padding: 0 var(--space-3);
350
+ box-sizing: border-box;
351
+ }
352
+
353
+ /* ---------------------------------------------------------
354
+ 6. LOADING OVERLAYS
355
+ --------------------------------------------------------- */
356
+
357
+ .form-control--loading::after {
358
+ content: "";
359
+ position: absolute;
360
+ top: 0;
361
+ right: 0;
362
+ bottom: 0;
363
+ left: 0;
364
+ border-radius: inherit;
365
+ background: var(--color-surface-subtle);
366
+ animation: formControlLoading 1.5s ease-in-out infinite;
367
+ pointer-events: none;
368
+ }
369
+
370
+ @keyframes formControlLoading {
371
+ 0% {
372
+ opacity: .35;
373
+ }
374
+ 50% {
375
+ opacity: .6;
376
+ }
377
+ 100% {
378
+ opacity: .35;
379
+ }
380
+ }
381
+
382
+ /* ---------------------------------------------------------
383
+ 7. FILE UPLOAD PRIMITIVES
384
+ --------------------------------------------------------- */
385
+
386
+ .form-control--file {
387
+ position: relative;
388
+ padding: var(--space-3);
389
+ border: var(--border-width) dashed var(--color-border-subtle);
390
+ border-radius: var(--radius-md);
391
+ background-color: var(--color-surface);
392
+ color: var(--color-text-muted);
393
+ cursor: pointer;
394
+ }
395
+
396
+ .form-control--file[type="file"] {
397
+ padding: 0;
398
+ border: none;
399
+ background: none;
400
+ position: static;
401
+ }
402
+
403
+ /* Drop surface */
404
+
405
+ .form-control-file-surface {
406
+ position: relative;
407
+ display: flex;
408
+ flex-direction: column;
409
+ gap: var(--space-2);
410
+ align-items: center;
411
+ justify-content: center;
412
+ padding: var(--space-6);
413
+
414
+ border: var(--border-width) dashed var(--color-border-subtle);
415
+ border-radius: var(--radius-md);
416
+ background-color: var(--color-surface);
417
+ cursor: pointer;
418
+ }
419
+
420
+ .form-control-file-surface input[type="file"] {
421
+ position: absolute;
422
+ top: 0;
423
+ right: 0;
424
+ bottom: 0;
425
+ left: 0;
426
+ opacity: 0;
427
+ cursor: pointer;
428
+ }
429
+
430
+ .form-control-file-surface:hover {
431
+ border-color: var(--color-border-strong);
432
+ background-color: var(--color-surface-subtle);
433
+ }
434
+
435
+ .form-control-file-surface:focus-within {
436
+ box-shadow: 0 0 0 var(--border-width-strong) var(--focus-ring-color);
437
+ border-color: var(--focus-ring-color);
438
+ }
439
+
440
+ .form-control-file-surface--disabled {
441
+ opacity: .65;
442
+ cursor: not-allowed;
443
+ pointer-events: none;
444
+ }
445
+
446
+ .form-control-file-surface--error {
447
+ border-color: var(--color-danger);
448
+ background-color: var(--color-danger-soft);
449
+ }
450
+
451
+ .form-control-file-surface--warning {
452
+ border-color: var(--color-warning);
453
+ background-color: var(--color-warning-soft);
454
+ }
455
+
456
+ .form-control-file-surface--success {
457
+ border-color: var(--color-success);
458
+ background-color: var(--color-success-soft);
459
+ }
460
+
461
+ .form-control-file-surface--info {
462
+ border-color: var(--color-info);
463
+ background-color: var(--color-info-soft);
464
+ }
465
+
466
+ /* Inline upload */
467
+
468
+ .file-upload-inline {
469
+ display: inline-flex;
470
+ align-items: center;
471
+ gap: var(--space-2);
472
+ }
473
+
474
+ .file-upload-inline__input {
475
+ position: absolute;
476
+ width: 1px;
477
+ height: 1px;
478
+ overflow: hidden;
479
+ clip: rect(0, 0, 0, 0);
480
+ }
481
+
482
+ .file-upload-inline__label {
483
+ cursor: pointer;
484
+ }
485
+
486
+ /* Loading shimmer on surface */
487
+
488
+ .form-control-file-surface.form-control--loading::after {
489
+ content: "";
490
+ position: absolute;
491
+ top: 0;
492
+ right: 0;
493
+ bottom: 0;
494
+ left: 0;
495
+ border-radius: inherit;
496
+ background-image: linear-gradient(
497
+ 90deg,
498
+ var(--color-muted-bg),
499
+ var(--color-surface),
500
+ var(--color-muted-bg)
501
+ );
502
+ background-size: 200% 100%;
503
+ animation: input-loading-shimmer 1.5s infinite;
504
+ }
505
+
506
+ /* ---------------------------------------------------------
507
+ 8. LAYOUT PRIMITIVES
508
+ --------------------------------------------------------- */
509
+
510
+ .form-row {
511
+ display: flex;
512
+ flex-wrap: wrap;
513
+ gap: var(--space-4);
514
+ }
515
+
516
+ .form-grid {
517
+ display: grid;
518
+ grid-gap: var(--space-4);
519
+ gap: var(--space-4);
520
+ }
521
+
522
+ .form-grid--two {
523
+ grid-template-columns: repeat(2, minmax(0, 1fr));
524
+ }
525
+
526
+ .form-grid--three {
527
+ grid-template-columns: repeat(3, minmax(0, 1fr));
528
+ }
529
+
530
+ .form-grid--four {
531
+ grid-template-columns: repeat(4, minmax(0, 1fr));
532
+ }
533
+
534
+ @media (max-width: 768px) {
535
+ .form-grid--two,
536
+ .form-grid--three,
537
+ .form-grid--four {
538
+ grid-template-columns: 1fr;
539
+ }
540
+ }
541
+
542
+ /* ---------------------------------------------------------
543
+ 9. FORM-LEVEL MESSAGES
544
+ --------------------------------------------------------- */
545
+
546
+ .form-message {
547
+ width: 100%;
548
+ padding: var(--space-4) var(--space-6);
549
+ border-radius: var(--radius-md);
550
+ border: var(--border-width) solid var(--color-border-subtle);
551
+ background-color: var(--color-surface-subtle);
552
+ font-size: var(--text-sm);
553
+ display: flex;
554
+ align-items: flex-start;
555
+ gap: var(--space-3);
556
+ }
557
+
558
+ .form-message__icon {
559
+ width: 1.25rem;
560
+ height: 1.25rem;
561
+ flex-shrink: 0;
562
+ }
563
+
564
+ .form-message__content {
565
+ display: flex;
566
+ flex-direction: column;
567
+ gap: var(--space-1);
568
+ }
569
+
570
+ .form-message--neutral {
571
+ color: var(--color-text-muted);
572
+ }
573
+
574
+ .form-message--error {
575
+ background-color: var(--color-danger-soft);
576
+ border-color: var(--color-danger);
577
+ }
578
+
579
+ .form-message--warning {
580
+ background-color: var(--color-warning-soft);
581
+ border-color: var(--color-warning);
582
+ }
583
+
584
+ .form-message--success {
585
+ background-color: var(--color-success-soft);
586
+ border-color: var(--color-success);
587
+ }
588
+
589
+ .form-message--info {
590
+ background-color: var(--color-info-soft);
591
+ border-color: var(--color-info);
592
+ }
593
+
594
+ /* ---------------------------------------------------------
595
+ 10. FORM SECTION STATES
596
+ --------------------------------------------------------- */
597
+
598
+ .form-section--error,
599
+ .form-section--warning,
600
+ .form-section--success,
601
+ .form-section--info {
602
+ padding: var(--space-3);
603
+ border-left: var(--border-width-strong) solid;
604
+ }
605
+
606
+ .form-section--error {
607
+ border-color: var(--color-danger);
608
+ }
609
+
610
+ .form-section--warning {
611
+ border-color: var(--color-warning);
612
+ }
613
+
614
+ .form-section--success {
615
+ border-color: var(--color-success);
616
+ }
617
+
618
+ .form-section--info {
619
+ border-color: var(--color-info);
620
+ }
621
+
622
+ .form-section--error:not(:last-child),
623
+ .form-section--warning:not(:last-child),
624
+ .form-section--success:not(:last-child),
625
+ .form-section--info:not(:last-child) {
626
+ margin-bottom: var(--space-4);
627
+ }