UNPKG

@tuentyfaiv/svelte-form

Version:

A form library for Svelte. It is built on top of Svelte and Typescript. Inspired by Formik and React Hook Form.

361 lines (339 loc) 11.1 kB
.svorm-select-container { position: relative; container: select / inline-size; display: block; box-sizing: border-box; width: 100%; z-index: 1; } .svorm-select-container::after { position: absolute; box-sizing: inherit; display: block; content: ""; width: 100%; height: calc(var(--svorm-space) * 2); transform: translateX(-50%); top: 100%; left: 50%; z-index: 0; } .svorm-select-container.top::after { top: auto; bottom: calc(var(--svorm-space) * 9); } .svorm-select-container:is([data-disabled="true"]) { cursor: not-allowed; filter: grayscale(1) opacity(0.5); } .svorm-select-label { display: block; box-sizing: inherit; width: 100%; margin-bottom: var(--svorm-space); color: rgb(var(--svorm-primary-text) / var(--svorm-primary-opacity)); font-size: calc(var(--svorm-space) * 4); line-height: calc(var(--svorm-space) * 5); font-family: var(--svorm-font); } .svorm-select-menu { position: relative; box-sizing: inherit; display: flex; justify-content: space-between; align-items: center; width: 100%; gap: calc(var(--svorm-space) * 2); padding-right: calc(var(--svorm-space) * 9); color: rgb(var(--svorm-primary-text) / var(--svorm-primary-opacity)); background-color: rgb(var(--svorm-placeholder) / var(--svorm-placeholder-opacity)); border: var(--svorm-border); border-radius: var(--svorm-radius); z-index: 0; } .svorm-select-menu:is([data-multiple="true"]) { padding-left: calc(var(--svorm-space) * 2.5); } .svorm-select-menu:is([data-multiple="true"]) .svorm-select-searchable, .svorm-select-menu:is([data-multiple="true"]) .svorm-select-nonsearchable { padding-left: 0; } .svorm-select-menu:is(:focus, :focus-visible) > .svorm-select-searchable { outline: 0; } .svorm-select-menu:is(:focus, :focus-visible).active > .svorm-select-options { width: calc(100% + (var(--svorm-border-width) * 4)); border-width: calc(var(--svorm-border-width) * 2); border-color: rgb(var(--svorm-secondary) / var(--svorm-secondary-opacity)); } .svorm-select-menu.active > .svorm-select-arrow { transform: translateY(-50%) rotateX(180deg); } .svorm-select-menu:has(> .svorm-select-value[role="combobox"]:not([aria-disabled="true"]):is(:focus, :focus-visible), .svorm-select-searchable:not(:disabled):is(:focus, :focus-visible)) { outline: var(--svorm-border); outline-color: rgb(var(--svorm-secondary) / var(--svorm-secondary-opacity)); border-color: rgb(var(--svorm-secondary) / var(--svorm-secondary-opacity)); } .svorm-select-menu:is([data-error="true"]):has(> .svorm-select-value[role="combobox"]:not([aria-disabled="true"]), > .svorm-select-value[role="combobox"]:not([aria-disabled="true"]):is(:focus, :focus-visible), .svorm-select-searchable:not(:disabled), .svorm-select-searchable:not(:disabled):is(:focus, :focus-visible)) { outline-color: rgb(var(--svorm-error) / var(--svorm-error-opacity)); border-color: rgb(var(--svorm-error) / var(--svorm-error-opacity)); } .svorm-select-value { box-sizing: inherit; display: flex; width: 100%; min-height: calc(var(--svorm-space) * 3.5); margin: 0; padding: calc(var(--svorm-space) * 2) 0; align-items: stretch; justify-content: flex-start; gap: var(--svorm-space); flex-wrap: wrap; } .svorm-select-value:is(:focus, :focus-visible) { outline: 0; } .svorm-select-item { box-sizing: inherit; display: flex; width: max-content; align-items: center; justify-content: flex-start; gap: var(--svorm-space); padding-left: var(--svorm-space); background-color: rgb(205 205 210 / 1); color: rgb(var(--svorm-primary-text) / var(--svorm-primary-opacity)); font-size: calc(var(--svorm-space) * 3.5); line-height: calc(var(--svorm-space) * 4); font-family: var(--svorm-font); border-radius: calc(var(--svorm-radius) / 2); } .dark .svorm-select-item, [data-theme="dark"] .svorm-select-item { background-color: rgb(114 116 129 / 1); } .dark .svorm-select-item:is([data-fixed="true"]), [data-theme="dark"] .svorm-select-item:is([data-fixed="true"]), .svorm-select-item:is([data-fixed="true"]) { background-color: rgb(var(--svorm-secondary) / var(--svorm-secondary-opacity)); color: rgb(var(--svorm-secondary-text) / var(--svorm-secondary-opacity)); padding: 0 var(--svorm-space); } .svorm-select-remove { display: block; box-sizing: inherit; width: calc(var(--svorm-space) * 4.5); height: 100%; margin: 0; padding: 0; background-color: transparent; color: rgb(var(--svorm-primary-text) / var(--svorm-primary-opacity)); font-size: calc(var(--svorm-space) * 4.5); line-height: calc(var(--svorm-space) * 4.5); font-family: var(--svorm-font); font-weight: 500; border: 0; border-left-color: rgb(var(--svorm-placeholder) / var(--svorm-placeholder-opacity)); border-radius: 0 calc(var(--svorm-radius) / 2) calc(var(--svorm-radius) / 2) 0; transition: background-color 200ms linear; will-change: background-color; } .svorm-select-remove:is(:hover) { cursor: pointer; } .svorm-select-remove:is(:hover, :focus, :focus-visible) { color: rgb(var(--svorm-error-text) / var(--svorm-error-opacity)); outline: 0; background-color: rgb(var(--svorm-error) / var(--svorm-error-opacity)); } .svorm-select-searchable, .svorm-select-nonsearchable { display: block; box-sizing: inherit; flex: 1; width: 100%; min-width: 100px; min-height: calc(var(--svorm-space) * 4.5); padding: 0 calc(var(--svorm-space) * 2.5); color: rgb(var(--svorm-primary-text) / var(--svorm-primary-opacity)); background-color: rgb(var(--svorm-placeholder) / var(--svorm-placeholder-opacity)); font-size: calc(var(--svorm-space) * 3.5); line-height: calc(var(--svorm-space) * 4.5); font-family: var(--svorm-font); border-top-left-radius: var(--svorm-radius); border-bottom-left-radius: var(--svorm-radius); border: 0; } .svorm-select-searchable:disabled { cursor: not-allowed; } .svorm-select-searchable:is(:focus, :focus-visible) { outline: 0; } .svorm-select-nonsearchable:is([data-placeholder="true"]), .svorm-select-searchable::placeholder { color: rgb(var(--svorm-placeholder-text) / var(--svorm-placeholder-opacity)); font-size: calc(var(--svorm-space) * 3.5); line-height: calc(var(--svorm-space) * 4.5); font-family: var(--svorm-font); } .svorm-select-clear { display: block; box-sizing: inherit; width: calc(var(--svorm-space) * 5); min-width: calc(var(--svorm-space) * 5); height: calc(var(--svorm-space) * 5); min-height: calc(var(--svorm-space) * 5); margin: 0; padding: 1px; background-color: transparent; color: rgb(var(--svorm-primary-text) / var(--svorm-primary-opacity)); font-size: calc(var(--svorm-space) * 5); line-height: calc(var(--svorm-space) * 5); font-weight: 500; font-family: var(--svorm-font); border: 0; border-radius: calc(var(--svorm-radius) / 2); transition: background-color 200ms linear; will-change: background-color; } .svorm-select-clear:is(:hover) { cursor: pointer; } .svorm-select-clear:is(:hover, :focus, :focus-visible) { color: rgb(var(--svorm-error) / var(--svorm-error-opacity)); outline: 0; } .svorm-select-arrow { position: absolute; display: block; box-sizing: inherit; width: calc(var(--svorm-space) * 6); min-width: calc(var(--svorm-space) * 6); height: calc(var(--svorm-space) * 6); min-height: calc(var(--svorm-space) * 6); padding: 1px; background-color: transparent; font-size: calc(var(--svorm-space) * 6); line-height: calc(var(--svorm-space) * 6); border: 0; transform: translateY(-50%); transition: transform 200ms linear; top: 50%; right: calc(var(--svorm-space) * 2); z-index: 0; } .svorm-select-arrow:disabled { cursor: not-allowed; } .svorm-select-icon { display: block; box-sizing: inherit; width: 100%; height: 100%; margin: 0; } .svorm-select-options { position: absolute; display: none; box-sizing: inherit; width: calc(100% + (var(--svorm-border-width) * 2)); max-height: 150px; padding: 0; margin: 0; background-color: rgb(var(--svorm-placeholder) / var(--svorm-placeholder-opacity)); border: var(--svorm-border); border-radius: var(--svorm-radius); box-shadow: var(--svorm-shadow); overflow-y: auto; justify-content: flex-start; align-items: center; flex-direction: column; transform: translateX(-50%); top: calc(100% + (var(--svorm-space) * 1.5)); left: 50%; z-index: 1; } .svorm-select-arrow:is([aria-expanded="true"]) + .svorm-select-options { display: flex; } .svorm-select-options.top { top: auto; bottom: calc(100% + (var(--svorm-space) * 2)); } .svorm-select-options::-webkit-scrollbar:vertical { width: calc((var(--svorm-space) * 2)); height: 100%; background-color: transparent; } .svorm-select-options::-webkit-scrollbar-thumb { background-color: rgb(var(--svorm-placeholder-700) / 1); border-radius: var(--svorm-radius); } .svorm-select-option { display: flex; justify-content: space-between; align-items: center; box-sizing: inherit; width: 100%; margin: 0; padding: calc(var(--svorm-space) * 2) calc(var(--svorm-space) * 2.5); color: rgb(var(--svorm-primary-text) / var(--svorm-primary-opacity)); font-size: calc(var(--svorm-space) * 3.5); line-height: calc(var(--svorm-space) * 4.5); font-family: var(--svorm-font); } .svorm-select-option[aria-disabled="true"] { pointer-events: none; } .svorm-select-option:is(.focus, :hover) { color: rgb(var(--svorm-white) / var(--svorm-white-opacity)); outline: 0; background-color: rgb(var(--svorm-primary) / var(--svorm-primary-opacity)); } .svorm-select-option > .svorm-select-icon { max-width: calc(var(--svorm-space) * 4.5); max-height: calc(var(--svorm-space) * 4.5); } .dark .svorm-select-option:is(.focus, :hover), [data-theme="dark"] .svorm-select-option:is(.focus, :hover) { color: rgb(16 94 68 / 1); } .svorm-select-empty { display: block; box-sizing: inherit; width: 100%; color: rgb(var(--svorm-placeholder-text) / var(--svorm-placeholder-opacity)); padding: calc(var(--svorm-space) * 2) calc(var(--svorm-space) * 2.5); font-size: calc(var(--svorm-space) * 3.5); line-height: calc(var(--svorm-space) * 4.5); font-family: var(--svorm-font); text-align: center; } .svorm-select-error { position: absolute; display: block; box-sizing: inherit; padding: var(--svorm-space); background-color: rgb(var(--svorm-placeholder) / var(--svorm-placeholder-opacity)); color: rgb(var(--svorm-error) / var(--svorm-error-opacity)); font-size: calc(var(--svorm-space) * 3); line-height: calc(var(--svorm-space) * 3); font-weight: 500; font-family: var(--svorm-font); border-radius: calc(var(--svorm-radius) * 2.5); transform: translateY(50%); bottom: calc(var(--svorm-space) * 4.5); right: calc(var(--svorm-space) * 9); z-index: 0; } @container select (max-width: 450px) { .svorm-select-error { width: 100%; left: 0; bottom: 0; background-color: transparent; padding: var(--svorm-space) 0; transform: translateY(calc(100% + var(--svorm-space))); } }