From 76bd78876932f4791d926919acc40c75a470d31c Mon Sep 17 00:00:00 2001 From: Michael Housh Date: Sat, 7 Feb 2026 18:16:01 -0500 Subject: [PATCH] feat: Adds createFromCSV to create rooms in the database, properly handling delegating airflow to another room. --- Package.swift | 3 + Public/css/output.css | 7 + Sources/CSVParser/Interface.swift | 5 +- Sources/CSVParser/Internal/Room+parsing.swift | 8 +- Sources/DatabaseClient/Interface.swift | 2 + Sources/DatabaseClient/Internal/Rooms.swift | 84 +- Sources/ManualDCore/Room.swift | 44 + Sources/ViewController/Live.swift | 2 +- Tests/DatabaseClientTests/Helpers.swift | 1 + Tests/DatabaseClientTests/RoomTests.swift | 28 +- input.css | 6 - output.css | 2825 ----------------- 12 files changed, 171 insertions(+), 2844 deletions(-) delete mode 100644 input.css delete mode 100644 output.css diff --git a/Package.swift b/Package.swift index 903f1d4..0001219 100644 --- a/Package.swift +++ b/Package.swift @@ -95,6 +95,9 @@ let package = Package( .target(name: "DatabaseClient"), .product(name: "DependenciesTestSupport", package: "swift-dependencies"), .product(name: "FluentSQLiteDriver", package: "fluent-sqlite-driver"), + ], + resources: [ + .copy("Resources") ] ), .target( diff --git a/Public/css/output.css b/Public/css/output.css index cca6d5f..74e15e4 100644 --- a/Public/css/output.css +++ b/Public/css/output.css @@ -6841,6 +6841,13 @@ margin-block-end: calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse))); } } + .space-y-3 { + :where(& > :not(:last-child)) { + --tw-space-y-reverse: 0; + margin-block-start: calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse)); + margin-block-end: calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse))); + } + } .space-y-4 { :where(& > :not(:last-child)) { --tw-space-y-reverse: 0; diff --git a/Sources/CSVParser/Interface.swift b/Sources/CSVParser/Interface.swift index 7a5b2b4..2e9b256 100644 --- a/Sources/CSVParser/Interface.swift +++ b/Sources/CSVParser/Interface.swift @@ -12,7 +12,7 @@ extension DependencyValues { @DependencyClient public struct CSVParser: Sendable { - public var parseRooms: @Sendable (Room.CSV) async throws -> [Room.Create] + public var parseRooms: @Sendable (Room.CSV) async throws -> [Room.CSV.Row] } extension CSVParser: DependencyKey { @@ -24,12 +24,11 @@ extension CSVParser: DependencyKey { throw CSVParsingError("Unreadable file data") } let rows = try RoomCSVParser().parse(string[...].utf8) - let rooms = rows.reduce(into: [Room.Create]()) { + return rows.reduce(into: [Room.CSV.Row]()) { if case .room(let room) = $1 { $0.append(room) } } - return rooms } ) } diff --git a/Sources/CSVParser/Internal/Room+parsing.swift b/Sources/CSVParser/Internal/Room+parsing.swift index b5b65be..5610f75 100644 --- a/Sources/CSVParser/Internal/Room+parsing.swift +++ b/Sources/CSVParser/Internal/Room+parsing.swift @@ -25,7 +25,7 @@ struct RoomRowParser: Parser { enum RoomRowType { case header(String) - case room(Room.Create) + case room(Room.CSV.Row) } struct RoomCreateParser: ParserPrinter { @@ -34,7 +34,7 @@ struct RoomCreateParser: ParserPrinter { // the room yet, so we will need an intermediate representation for the csv data // that uses a room's name or disregard and require user to delegate airflow in // the ui. - var body: some ParserPrinter { + var body: some ParserPrinter { ParsePrint { Prefix { $0 != UInt8(ascii: ",") }.map(.string) ",".utf8 @@ -51,9 +51,9 @@ struct RoomCreateParser: ParserPrinter { Int.parser() ",".utf8 Optionally { - Room.ID.parser() + Prefix { $0 != UInt8(ascii: "\n") }.map(.string) } } - .map(.memberwise(Room.Create.init)) + .map(.memberwise(Room.CSV.Row.init)) } } diff --git a/Sources/DatabaseClient/Interface.swift b/Sources/DatabaseClient/Interface.swift index b71475d..ea36739 100644 --- a/Sources/DatabaseClient/Interface.swift +++ b/Sources/DatabaseClient/Interface.swift @@ -91,6 +91,7 @@ public struct DatabaseClient: Sendable { public struct Rooms: Sendable { public var create: @Sendable (Project.ID, Room.Create) async throws -> Room public var createMany: @Sendable (Project.ID, [Room.Create]) async throws -> [Room] + public var createFromCSV: @Sendable (Project.ID, [Room.CSV.Row]) async throws -> [Room] public var delete: @Sendable (Room.ID) async throws -> Void public var deleteRectangularSize: @Sendable (Room.ID, Room.RectangularSize.ID) async throws -> Room @@ -98,6 +99,7 @@ public struct DatabaseClient: Sendable { public var fetch: @Sendable (Project.ID) async throws -> [Room] public var update: @Sendable (Room.ID, Room.Update) async throws -> Room public var updateRectangularSize: @Sendable (Room.ID, Room.RectangularSize) async throws -> Room + } @DependencyClient diff --git a/Sources/DatabaseClient/Internal/Rooms.swift b/Sources/DatabaseClient/Internal/Rooms.swift index 7d1b406..e037a26 100644 --- a/Sources/DatabaseClient/Internal/Rooms.swift +++ b/Sources/DatabaseClient/Internal/Rooms.swift @@ -16,11 +16,59 @@ extension DatabaseClient.Rooms: TestDependencyKey { return try model.toDTO() }, createMany: { projectID, rooms in - try await rooms.asyncMap { request in - let model = try request.toModel(projectID: projectID) - try await model.validateAndSave(on: database) - return try model.toDTO() + try await RoomModel.createMany(projectID: projectID, rooms: rooms, on: database) + }, + createFromCSV: { projectID, rows in + + database.logger.debug("\nCreate From CSV rows: \(rows)\n") + + // Filter out rows that delegate their airflow / load to another room, + // these need to be created last. + let rowsThatDelegate = rows.filter({ + $0.delegatedToName != nil && $0.delegatedToName != "" + }) + + let initialRooms = rows.filter({ + $0.delegatedToName == nil || $0.delegatedToName == "" + }) + .map(\.createModel) + + database.logger.debug("\nInitial rows: \(initialRooms)\n") + + let initialCreated = try await RoomModel.createMany( + projectID: projectID, + rooms: initialRooms, + on: database + ) + database.logger.debug("\nInitially created rows: \(initialCreated)\n") + + let roomsThatDelegateModels = try rowsThatDelegate.reduce(into: [Room.Create]()) { + array, row in + database.logger.debug("\n\(row.name), delegating to: \(row.delegatedToName!)\n") + guard let created = initialCreated.first(where: { $0.name == row.delegatedToName }) else { + database.logger.debug( + "\nUnable to find created room with name: \(row.delegatedToName!)\n" + ) + throw NotFoundError() + } + array.append( + Room.Create.init( + name: row.name, + heatingLoad: row.heatingLoad, + coolingTotal: row.coolingTotal, + coolingSensible: row.coolingSensible, + registerCount: 0, + delegatedTo: created.id + ) + ) } + + return try await RoomModel.createMany( + projectID: projectID, + rooms: roomsThatDelegateModels, + on: database + ) + initialCreated + }, delete: { id in guard let model = try await RoomModel.find(id, on: database) else { @@ -81,6 +129,34 @@ extension DatabaseClient.Rooms: TestDependencyKey { } } +extension Room.CSV.Row { + fileprivate var createModel: Room.Create { + assert(delegatedToName == nil || delegatedToName == "") + return .init( + name: name, + heatingLoad: heatingLoad, + coolingTotal: coolingTotal, + coolingSensible: coolingSensible, + registerCount: registerCount, + delegatedTo: nil + ) + } +} + +extension RoomModel { + fileprivate static func createMany( + projectID: Project.ID, + rooms: [Room.Create], + on database: any Database + ) async throws -> [Room] { + try await rooms.asyncMap { request in + let model = try request.toModel(projectID: projectID) + try await model.validateAndSave(on: database) + return try model.toDTO() + } + } +} + extension Room.Create { func toModel(projectID: Project.ID) throws -> RoomModel { diff --git a/Sources/ManualDCore/Room.swift b/Sources/ManualDCore/Room.swift index 4f7eb50..7ce5ebf 100644 --- a/Sources/ManualDCore/Room.swift +++ b/Sources/ManualDCore/Room.swift @@ -148,6 +148,50 @@ extension Room { public init(file: Data) { self.file = file } + + /// Represents a row in a CSV file. + /// + /// This is similar to ``Room.Create``, but since the rooms are not yet + /// created, delegating to another room is done via the room's name + /// instead of id. + /// + public struct Row: Codable, Equatable, Sendable { + + /// A unique name for the room in the project. + public let name: String + + /// The heating load required for the room (from Manual-J). + public let heatingLoad: Double + + /// The total cooling load required for the room (from Manual-J). + public let coolingTotal: Double? + + /// An optional sensible cooling load for the room. + public let coolingSensible: Double? + + /// The number of registers for the room. + public let registerCount: Int + + /// An optional room that this room delegates it's airflow to. + public let delegatedToName: String? + + public init( + name: String, + heatingLoad: Double, + coolingTotal: Double? = nil, + coolingSensible: Double? = nil, + registerCount: Int, + delegatedToName: String? = nil + ) { + self.name = name + self.heatingLoad = heatingLoad + self.coolingTotal = coolingTotal + self.coolingSensible = coolingSensible + self.registerCount = registerCount + self.delegatedToName = delegatedToName + } + } + } /// Represents a rectangular size calculation that is stored in the diff --git a/Sources/ViewController/Live.swift b/Sources/ViewController/Live.swift index df63bc3..9c1670f 100644 --- a/Sources/ViewController/Live.swift +++ b/Sources/ViewController/Live.swift @@ -293,7 +293,7 @@ extension SiteRoute.View.ProjectRoute.RoomRoute { case .csv(let csv): return await roomsView(on: request, projectID: projectID) { let rooms = try await csvParser.parseRooms(csv) - _ = try await database.rooms.createMany(projectID, rooms) + _ = try await database.rooms.createFromCSV(projectID, rooms) } // return EmptyHTML() diff --git a/Tests/DatabaseClientTests/Helpers.swift b/Tests/DatabaseClientTests/Helpers.swift index f552794..e153e77 100644 --- a/Tests/DatabaseClientTests/Helpers.swift +++ b/Tests/DatabaseClientTests/Helpers.swift @@ -1,4 +1,5 @@ import App +import CSVParser import DatabaseClient import Dependencies import Fluent diff --git a/Tests/DatabaseClientTests/RoomTests.swift b/Tests/DatabaseClientTests/RoomTests.swift index 8107e7e..03816f4 100644 --- a/Tests/DatabaseClientTests/RoomTests.swift +++ b/Tests/DatabaseClientTests/RoomTests.swift @@ -1,4 +1,6 @@ +import CSVParser import Dependencies +import FileClient import Foundation import ManualDCore import Parsing @@ -63,6 +65,31 @@ struct RoomTests { } } + @Test + func createFromCSV() async throws { + try await withTestUserAndProject { + $0.csvParser = .liveValue + } operation: { _, project in + @Dependency(\.csvParser) var csvParser + @Dependency(\.database) var database + @Dependency(\.fileClient) var fileClient + + let csvPath = Bundle.module.path(forResource: "rooms", ofType: "csv") + let csvFile = Room.CSV(file: try Data(contentsOf: URL(filePath: csvPath!))) + let rows = try await csvParser.parseRooms(csvFile) + print() + print("ROWS: \(rows)") + print() + + let created = try await database.rooms.createFromCSV(project.id, rows) + + print() + print("CREATED: \(created)") + print() + #expect(created.count == rows.count) + } + } + @Test func notFound() async throws { try await withDatabase { @@ -157,4 +184,3 @@ struct RoomTests { } } } - diff --git a/input.css b/input.css deleted file mode 100644 index 8bc6dde..0000000 --- a/input.css +++ /dev/null @@ -1,6 +0,0 @@ -@import "tailwindcss"; - -@source not "./tailwindcss"; -@source not "./daisyui{,*}.mjs"; - -@plugin "./daisyui.mjs"; diff --git a/output.css b/output.css deleted file mode 100644 index e96a434..0000000 --- a/output.css +++ /dev/null @@ -1,2825 +0,0 @@ -/*! tailwindcss v4.1.18 | MIT License | https://tailwindcss.com */ -@layer properties; -@layer theme, base, components, utilities; -@layer theme { - :root, :host { - --font-sans: ui-sans-serif, system-ui, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', - 'Noto Color Emoji'; - --font-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', - monospace; - --color-red-500: oklch(63.7% 0.237 25.331); - --color-red-600: oklch(57.7% 0.245 27.325); - --color-green-400: oklch(79.2% 0.209 151.711); - --color-indigo-600: oklch(51.1% 0.262 276.966); - --color-slate-300: oklch(86.9% 0.022 252.894); - --color-slate-900: oklch(20.8% 0.042 265.755); - --color-gray-200: oklch(92.8% 0.006 264.531); - --color-gray-400: oklch(70.7% 0.022 261.325); - --color-black: #000; - --color-white: #fff; - --spacing: 0.25rem; - --text-sm: 0.875rem; - --text-sm--line-height: calc(1.25 / 0.875); - --text-lg: 1.125rem; - --text-lg--line-height: calc(1.75 / 1.125); - --text-xl: 1.25rem; - --text-xl--line-height: calc(1.75 / 1.25); - --text-2xl: 1.5rem; - --text-2xl--line-height: calc(2 / 1.5); - --text-3xl: 1.875rem; - --text-3xl--line-height: calc(2.25 / 1.875); - --font-weight-bold: 700; - --radius-sm: 0.25rem; - --radius-md: 0.375rem; - --radius-lg: 0.5rem; - --ease-out: cubic-bezier(0, 0, 0.2, 1); - --ease-in-out: cubic-bezier(0.4, 0, 0.2, 1); - --default-transition-duration: 150ms; - --default-transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); - --default-font-family: var(--font-sans); - --default-mono-font-family: var(--font-mono); - } -} -@layer base { - *, ::after, ::before, ::backdrop, ::file-selector-button { - box-sizing: border-box; - margin: 0; - padding: 0; - border: 0 solid; - } - html, :host { - line-height: 1.5; - -webkit-text-size-adjust: 100%; - tab-size: 4; - font-family: var(--default-font-family, ui-sans-serif, system-ui, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji'); - font-feature-settings: var(--default-font-feature-settings, normal); - font-variation-settings: var(--default-font-variation-settings, normal); - -webkit-tap-highlight-color: transparent; - } - hr { - height: 0; - color: inherit; - border-top-width: 1px; - } - abbr:where([title]) { - -webkit-text-decoration: underline dotted; - text-decoration: underline dotted; - } - h1, h2, h3, h4, h5, h6 { - font-size: inherit; - font-weight: inherit; - } - a { - color: inherit; - -webkit-text-decoration: inherit; - text-decoration: inherit; - } - b, strong { - font-weight: bolder; - } - code, kbd, samp, pre { - font-family: var(--default-mono-font-family, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace); - font-feature-settings: var(--default-mono-font-feature-settings, normal); - font-variation-settings: var(--default-mono-font-variation-settings, normal); - font-size: 1em; - } - small { - font-size: 80%; - } - sub, sup { - font-size: 75%; - line-height: 0; - position: relative; - vertical-align: baseline; - } - sub { - bottom: -0.25em; - } - sup { - top: -0.5em; - } - table { - text-indent: 0; - border-color: inherit; - border-collapse: collapse; - } - :-moz-focusring { - outline: auto; - } - progress { - vertical-align: baseline; - } - summary { - display: list-item; - } - ol, ul, menu { - list-style: none; - } - img, svg, video, canvas, audio, iframe, embed, object { - display: block; - vertical-align: middle; - } - img, video { - max-width: 100%; - height: auto; - } - button, input, select, optgroup, textarea, ::file-selector-button { - font: inherit; - font-feature-settings: inherit; - font-variation-settings: inherit; - letter-spacing: inherit; - color: inherit; - border-radius: 0; - background-color: transparent; - opacity: 1; - } - :where(select:is([multiple], [size])) optgroup { - font-weight: bolder; - } - :where(select:is([multiple], [size])) optgroup option { - padding-inline-start: 20px; - } - ::file-selector-button { - margin-inline-end: 4px; - } - ::placeholder { - opacity: 1; - } - @supports (not (-webkit-appearance: -apple-pay-button)) or (contain-intrinsic-size: 1px) { - ::placeholder { - color: currentcolor; - @supports (color: color-mix(in lab, red, red)) { - color: color-mix(in oklab, currentcolor 50%, transparent); - } - } - } - textarea { - resize: vertical; - } - ::-webkit-search-decoration { - -webkit-appearance: none; - } - ::-webkit-date-and-time-value { - min-height: 1lh; - text-align: inherit; - } - ::-webkit-datetime-edit { - display: inline-flex; - } - ::-webkit-datetime-edit-fields-wrapper { - padding: 0; - } - ::-webkit-datetime-edit, ::-webkit-datetime-edit-year-field, ::-webkit-datetime-edit-month-field, ::-webkit-datetime-edit-day-field, ::-webkit-datetime-edit-hour-field, ::-webkit-datetime-edit-minute-field, ::-webkit-datetime-edit-second-field, ::-webkit-datetime-edit-millisecond-field, ::-webkit-datetime-edit-meridiem-field { - padding-block: 0; - } - ::-webkit-calendar-picker-indicator { - line-height: 1; - } - :-moz-ui-invalid { - box-shadow: none; - } - button, input:where([type='button'], [type='reset'], [type='submit']), ::file-selector-button { - appearance: button; - } - ::-webkit-inner-spin-button, ::-webkit-outer-spin-button { - height: auto; - } - [hidden]:where(:not([hidden='until-found'])) { - display: none !important; - } -} -@layer utilities { - .modal { - @layer daisyui.l1.l2.l3 { - pointer-events: none; - visibility: hidden; - position: fixed; - inset: calc(0.25rem * 0); - margin: calc(0.25rem * 0); - display: grid; - height: 100%; - max-height: none; - width: 100%; - max-width: none; - align-items: center; - justify-items: center; - background-color: transparent; - padding: calc(0.25rem * 0); - color: inherit; - transition: visibility 0.3s allow-discrete, background-color 0.3s ease-out, opacity 0.1s ease-out; - overflow: clip; - overscroll-behavior: contain; - z-index: 999; - scrollbar-gutter: auto; - &::backdrop { - display: none; - } - } - @layer daisyui.l1.l2 { - &.modal-open, &[open], &:target, .modal-toggle:checked + & { - pointer-events: auto; - visibility: visible; - opacity: 100%; - transition: visibility 0s allow-discrete, background-color 0.3s ease-out, opacity 0.1s ease-out; - background-color: oklch(0% 0 0/ 0.4); - .modal-box { - translate: 0 0; - scale: 1; - opacity: 1; - } - :root:has(&) { - --page-has-backdrop: 1; - --page-overflow: hidden; - --page-scroll-bg: var(--page-scroll-bg-on); - --page-scroll-gutter: stable; - --page-scroll-transition: var(--page-scroll-transition-on); - animation: set-page-has-scroll forwards; - animation-timeline: scroll(); - } - } - @starting-style { - &.modal-open, &[open], &:target, .modal-toggle:checked + & { - opacity: 0%; - } - } - } - } - .drawer-side { - :where(&) { - @layer daisyui.l1.l2.l3 { - overflow-x: hidden; - overflow-y: hidden; - } - } - @layer daisyui.l1.l2.l3 { - pointer-events: none; - visibility: hidden; - position: fixed; - inset-inline-start: calc(0.25rem * 0); - top: calc(0.25rem * 0); - z-index: 10; - grid-column-start: 1; - grid-row-start: 1; - display: grid; - width: 100%; - grid-template-columns: repeat(1, minmax(0, 1fr)); - grid-template-rows: repeat(1, minmax(0, 1fr)); - align-items: flex-start; - justify-items: start; - overscroll-behavior: contain; - background-color: transparent; - opacity: 0%; - transition: opacity 0.2s ease-out 0.1s allow-discrete, visibility 0.3s ease-out 0.1s allow-discrete; - height: 100vh; - height: 100dvh; - > .drawer-overlay { - position: sticky; - top: calc(0.25rem * 0); - cursor: pointer; - place-self: stretch; - background-color: oklch(0% 0 0 / 40%); - } - > * { - grid-column-start: 1; - grid-row-start: 1; - } - > :not(.drawer-overlay) { - will-change: transform; - transition: translate 0.3s ease-out, width 0.2s ease-out; - translate: -100%; - [dir="rtl"] & { - translate: 100%; - } - } - } - } - .drawer-toggle { - @layer daisyui.l1.l2.l3 { - position: fixed; - height: calc(0.25rem * 0); - width: calc(0.25rem * 0); - appearance: none; - opacity: 0%; - :where(&:checked ~ .drawer-side) { - scrollbar-color: currentColor oklch(0 0 0 / calc(var(--page-has-backdrop, 0) * 0.4)); - @supports (color: color-mix(in lab, red, red)) { - scrollbar-color: color-mix(in oklch, currentColor 35%, #0000) oklch(0 0 0 / calc(var(--page-has-backdrop, 0) * 0.4)); - } - } - :where(:root:has(&:checked)) { - --page-has-backdrop: 1; - --page-overflow: hidden; - --page-scroll-bg: var(--page-scroll-bg-on); - --page-scroll-gutter: stable; - --page-scroll-transition: var(--page-scroll-transition-on); - animation: set-page-has-scroll forwards; - animation-timeline: scroll(); - } - } - @layer daisyui.l1.l2 { - :where(&:checked ~ .drawer-side) { - pointer-events: auto; - visibility: visible; - overflow-y: auto; - opacity: 100%; - > :not(.drawer-overlay) { - translate: 0%; - } - } - &:focus-visible ~ .drawer-content label.drawer-button { - outline: 2px solid; - outline-offset: 2px; - } - } - } - .tooltip { - @layer daisyui.l1.l2.l3 { - position: relative; - display: inline-block; - --tt-bg: var(--color-neutral); - --tt-off: calc(100% + 0.5rem); - --tt-tail: calc(100% + 1px + 0.25rem); - & > .tooltip-content, &[data-tip]:before { - position: absolute; - max-width: 20rem; - border-radius: var(--radius-field); - padding-inline: calc(0.25rem * 2); - padding-block: calc(0.25rem * 1); - text-align: center; - white-space: normal; - color: var(--color-neutral-content); - opacity: 0%; - font-size: 0.875rem; - line-height: 1.25; - background-color: var(--tt-bg); - width: max-content; - pointer-events: none; - z-index: 2; - --tw-content: attr(data-tip); - content: var(--tw-content); - } - &:after { - opacity: 0%; - background-color: var(--tt-bg); - content: ""; - pointer-events: none; - width: 0.625rem; - height: 0.25rem; - display: block; - position: absolute; - mask-repeat: no-repeat; - mask-position: -1px 0; - --mask-tooltip: url("data:image/svg+xml,%3Csvg width='10' height='4' viewBox='0 0 8 4' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M0.500009 1C3.5 1 3.00001 4 5.00001 4C7 4 6.5 1 9.5 1C10 1 10 0.499897 10 0H0C-1.99338e-08 0.5 0 1 0.500009 1Z' fill='black'/%3E%3C/svg%3E%0A"); - mask-image: var(--mask-tooltip); - } - @media (prefers-reduced-motion: no-preference) { - & > .tooltip-content, &[data-tip]:before, &:after { - transition: opacity 0.2s cubic-bezier(0.4, 0, 0.2, 1) 75ms, transform 0.2s cubic-bezier(0.4, 0, 0.2, 1) 75ms; - } - } - &:is([data-tip]:not([data-tip=""]), :has(.tooltip-content:not(:empty))) { - &.tooltip-open, &:hover, &:has(:focus-visible) { - & > .tooltip-content, &[data-tip]:before, &:after { - opacity: 100%; - --tt-pos: 0rem; - @media (prefers-reduced-motion: no-preference) { - transition: opacity 0.2s cubic-bezier(0.4, 0, 0.2, 1) 0s, transform 0.2s cubic-bezier(0.4, 0, 0.2, 1) 0s; - } - } - } - } - } - @layer daisyui.l1.l2 { - > .tooltip-content, &[data-tip]:before { - transform: translateX(-50%) translateY(var(--tt-pos, 0.25rem)); - inset: auto auto var(--tt-off) 50%; - } - &:after { - transform: translateX(-50%) translateY(var(--tt-pos, 0.25rem)); - inset: auto auto var(--tt-tail) 50%; - } - } - } - .dropdown { - @layer daisyui.l1.l2.l3 { - position: relative; - display: inline-block; - position-area: var(--anchor-v, bottom) var(--anchor-h, span-right); - & > *:not(:has(~ [class*="dropdown-content"])):focus { - --tw-outline-style: none; - outline-style: none; - @media (forced-colors: active) { - outline: 2px solid transparent; - outline-offset: 2px; - } - } - .dropdown-content { - position: absolute; - } - &.dropdown-close .dropdown-content, &:not(details, .dropdown-open, .dropdown-hover:hover, :focus-within) .dropdown-content, &.dropdown-hover:not(:hover) [tabindex]:first-child:focus:not(:focus-visible) ~ .dropdown-content { - display: none; - transform-origin: top; - opacity: 0%; - scale: 95%; - } - &[popover], .dropdown-content { - z-index: 999; - @media (prefers-reduced-motion: no-preference) { - animation: dropdown 0.2s; - transition-property: opacity, scale, display; - transition-behavior: allow-discrete; - transition-duration: 0.2s; - transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); - } - } - @starting-style { - &[popover], .dropdown-content { - scale: 95%; - opacity: 0; - } - } - &:not(.dropdown-close) { - &.dropdown-open, &:not(.dropdown-hover):focus, &:focus-within { - > [tabindex]:first-child { - pointer-events: none; - } - .dropdown-content { - opacity: 100%; - scale: 100%; - } - } - &.dropdown-hover:hover { - .dropdown-content { - opacity: 100%; - scale: 100%; - } - } - } - &:is(details) { - summary { - &::-webkit-details-marker { - display: none; - } - } - } - &:where([popover]) { - background: #0000; - } - &[popover] { - position: fixed; - color: inherit; - @supports not (position-area: bottom) { - margin: auto; - &.dropdown-close, &.dropdown-open:not(:popover-open) { - display: none; - transform-origin: top; - opacity: 0%; - scale: 95%; - } - &::backdrop { - background-color: color-mix(in oklab, #000 30%, #0000); - } - } - &.dropdown-close, &:not(.dropdown-open, :popover-open) { - display: none; - transform-origin: top; - opacity: 0%; - scale: 95%; - } - } - } - } - .btn { - :where(&) { - @layer daisyui.l1.l2.l3 { - width: unset; - } - } - @layer daisyui.l1.l2.l3 { - display: inline-flex; - flex-shrink: 0; - cursor: pointer; - flex-wrap: nowrap; - align-items: center; - justify-content: center; - gap: calc(0.25rem * 1.5); - text-align: center; - vertical-align: middle; - outline-offset: 2px; - webkit-user-select: none; - user-select: none; - padding-inline: var(--btn-p); - color: var(--btn-fg); - --tw-prose-links: var(--btn-fg); - height: var(--size); - font-size: var(--fontsize, 0.875rem); - font-weight: 600; - outline-color: var(--btn-color, var(--color-base-content)); - transition-property: color, background-color, border-color, box-shadow; - transition-timing-function: cubic-bezier(0, 0, 0.2, 1); - transition-duration: 0.2s; - border-start-start-radius: var(--join-ss, var(--radius-field)); - border-start-end-radius: var(--join-se, var(--radius-field)); - border-end-start-radius: var(--join-es, var(--radius-field)); - border-end-end-radius: var(--join-ee, var(--radius-field)); - background-color: var(--btn-bg); - background-size: auto, calc(var(--noise) * 100%); - background-image: none, var(--btn-noise); - border-width: var(--border); - border-style: solid; - border-color: var(--btn-border); - text-shadow: 0 0.5px oklch(100% 0 0 / calc(var(--depth) * 0.15)); - touch-action: manipulation; - box-shadow: 0 0.5px 0 0.5px oklch(100% 0 0 / calc(var(--depth) * 6%)) inset, var(--btn-shadow); - --size: calc(var(--size-field, 0.25rem) * 10); - --btn-bg: var(--btn-color, var(--color-base-200)); - --btn-fg: var(--color-base-content); - --btn-p: 1rem; - --btn-border: var(--btn-bg); - @supports (color: color-mix(in lab, red, red)) { - --btn-border: color-mix(in oklab, var(--btn-bg), #000 calc(var(--depth) * 5%)); - } - --btn-shadow: 0 3px 2px -2px var(--btn-bg), - 0 4px 3px -2px var(--btn-bg); - @supports (color: color-mix(in lab, red, red)) { - --btn-shadow: 0 3px 2px -2px color-mix(in oklab, var(--btn-bg) calc(var(--depth) * 30%), #0000), - 0 4px 3px -2px color-mix(in oklab, var(--btn-bg) calc(var(--depth) * 30%), #0000); - } - --btn-noise: var(--fx-noise); - @media (hover: hover) { - &:hover { - --btn-bg: var(--btn-color, var(--color-base-200)); - @supports (color: color-mix(in lab, red, red)) { - --btn-bg: color-mix(in oklab, var(--btn-color, var(--color-base-200)), #000 7%); - } - } - } - &:focus-visible, &:has(:focus-visible) { - outline-width: 2px; - outline-style: solid; - isolation: isolate; - } - &:active:not(.btn-active) { - translate: 0 0.5px; - --btn-bg: var(--btn-color, var(--color-base-200)); - @supports (color: color-mix(in lab, red, red)) { - --btn-bg: color-mix(in oklab, var(--btn-color, var(--color-base-200)), #000 5%); - } - --btn-border: var(--btn-color, var(--color-base-200)); - @supports (color: color-mix(in lab, red, red)) { - --btn-border: color-mix(in oklab, var(--btn-color, var(--color-base-200)), #000 7%); - } - --btn-shadow: 0 0 0 0 oklch(0% 0 0/0), 0 0 0 0 oklch(0% 0 0/0); - } - &:is(input[type="checkbox"], input[type="radio"]) { - appearance: none; - &[aria-label]::after { - --tw-content: attr(aria-label); - content: var(--tw-content); - } - } - &:where(input:checked:not(.filter .btn)) { - --btn-color: var(--color-primary); - --btn-fg: var(--color-primary-content); - isolation: isolate; - } - } - &:disabled { - @layer daisyui.l1.l2 { - &:not(.btn-link, .btn-ghost) { - background-color: var(--color-base-content); - @supports (color: color-mix(in lab, red, red)) { - background-color: color-mix(in oklab, var(--color-base-content) 10%, transparent); - } - box-shadow: none; - } - pointer-events: none; - --btn-border: #0000; - --btn-noise: none; - --btn-fg: var(--color-base-content); - @supports (color: color-mix(in lab, red, red)) { - --btn-fg: color-mix(in oklch, var(--color-base-content) 20%, #0000); - } - } - } - &[disabled] { - @layer daisyui.l1.l2 { - &:not(.btn-link, .btn-ghost) { - background-color: var(--color-base-content); - @supports (color: color-mix(in lab, red, red)) { - background-color: color-mix(in oklab, var(--color-base-content) 10%, transparent); - } - box-shadow: none; - } - pointer-events: none; - --btn-border: #0000; - --btn-noise: none; - --btn-fg: var(--color-base-content); - @supports (color: color-mix(in lab, red, red)) { - --btn-fg: color-mix(in oklch, var(--color-base-content) 20%, #0000); - } - } - } - } - .loading { - @layer daisyui.l1.l2.l3 { - pointer-events: none; - display: inline-block; - aspect-ratio: 1 / 1; - background-color: currentcolor; - vertical-align: middle; - width: calc(var(--size-selector, 0.25rem) * 6); - mask-size: 100%; - mask-repeat: no-repeat; - mask-position: center; - mask-image: url("data:image/svg+xml,%3Csvg width='24' height='24' stroke='black' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cg transform-origin='center'%3E%3Ccircle cx='12' cy='12' r='9.5' fill='none' stroke-width='3' stroke-linecap='round'%3E%3CanimateTransform attributeName='transform' type='rotate' from='0 12 12' to='360 12 12' dur='2s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dasharray' values='0,150;42,150;42,150' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dashoffset' values='0;-16;-59' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3C/circle%3E%3C/g%3E%3C/svg%3E"); - } - } - .validator-hint { - @layer daisyui.l1.l2.l3 { - visibility: hidden; - margin-top: calc(0.25rem * 2); - font-size: 0.75rem; - } - } - .validator { - @layer daisyui.l1.l2.l3 { - &:user-valid, &:has(:user-valid) { - &, &:focus, &:checked, &[aria-checked="true"], &:focus-within { - --input-color: var(--color-success); - } - } - &:user-invalid, &:has(:user-invalid), &[aria-invalid]:not([aria-invalid="false"]), &:has([aria-invalid]:not([aria-invalid="false"])) { - &, &:focus, &:checked, &[aria-checked="true"], &:focus-within { - --input-color: var(--color-error); - } - & ~ .validator-hint { - visibility: visible; - color: var(--color-error); - } - } - } - &:user-invalid, &:has(:user-invalid), &[aria-invalid]:not([aria-invalid="false"]), &:has([aria-invalid]:not([aria-invalid="false"])) { - & ~ .validator-hint { - display: revert-layer; - } - } - } - .input { - @layer daisyui.l1.l2.l3 { - cursor: text; - border: var(--border) solid #0000; - position: relative; - display: inline-flex; - flex-shrink: 1; - appearance: none; - align-items: center; - gap: calc(0.25rem * 2); - background-color: var(--color-base-100); - padding-inline: calc(0.25rem * 3); - vertical-align: middle; - white-space: nowrap; - width: clamp(3rem, 20rem, 100%); - height: var(--size); - font-size: max(var(--font-size, 0.875rem), 0.875rem); - touch-action: manipulation; - border-start-start-radius: var(--join-ss, var(--radius-field)); - border-start-end-radius: var(--join-se, var(--radius-field)); - border-end-start-radius: var(--join-es, var(--radius-field)); - border-end-end-radius: var(--join-ee, var(--radius-field)); - border-color: var(--input-color); - box-shadow: 0 1px var(--input-color) inset, 0 -1px oklch(100% 0 0 / calc(var(--depth) * 0.1)) inset; - @supports (color: color-mix(in lab, red, red)) { - box-shadow: 0 1px color-mix(in oklab, var(--input-color) calc(var(--depth) * 10%), #0000) inset, 0 -1px oklch(100% 0 0 / calc(var(--depth) * 0.1)) inset; - } - --size: calc(var(--size-field, 0.25rem) * 10); - --input-color: var(--color-base-content); - @supports (color: color-mix(in lab, red, red)) { - --input-color: color-mix(in oklab, var(--color-base-content) 20%, #0000); - } - &:where(input) { - display: inline-flex; - } - :where(input) { - display: inline-flex; - height: 100%; - width: 100%; - appearance: none; - background-color: transparent; - border: none; - &:focus, &:focus-within { - --tw-outline-style: none; - outline-style: none; - @media (forced-colors: active) { - outline: 2px solid transparent; - outline-offset: 2px; - } - } - } - :where(input[type="url"]), :where(input[type="email"]) { - direction: ltr; - } - :where(input[type="date"]) { - display: inline-flex; - } - &:focus, &:focus-within { - --input-color: var(--color-base-content); - box-shadow: 0 1px var(--input-color); - @supports (color: color-mix(in lab, red, red)) { - box-shadow: 0 1px color-mix(in oklab, var(--input-color) calc(var(--depth) * 10%), #0000); - } - outline: 2px solid var(--input-color); - outline-offset: 2px; - isolation: isolate; - } - @media (pointer: coarse) { - @supports (-webkit-touch-callout: none) { - &:focus, &:focus-within { - --font-size: 1rem; - } - } - } - &:has(> input[disabled]), &:is(:disabled, [disabled]), fieldset:disabled & { - cursor: not-allowed; - border-color: var(--color-base-200); - background-color: var(--color-base-200); - color: var(--color-base-content); - @supports (color: color-mix(in lab, red, red)) { - color: color-mix(in oklab, var(--color-base-content) 40%, transparent); - } - &::placeholder { - color: var(--color-base-content); - @supports (color: color-mix(in lab, red, red)) { - color: color-mix(in oklab, var(--color-base-content) 20%, transparent); - } - } - box-shadow: none; - } - &:has(> input[disabled]) > input[disabled] { - cursor: not-allowed; - } - &::-webkit-date-and-time-value { - text-align: inherit; - } - &[type="number"] { - &::-webkit-inner-spin-button { - margin-block: calc(0.25rem * -3); - margin-inline-end: calc(0.25rem * -3); - } - } - &::-webkit-calendar-picker-indicator { - position: absolute; - inset-inline-end: 0.75em; - } - &:has(> input[type="date"]) { - :where(input[type="date"]) { - display: inline-flex; - webkit-appearance: none; - appearance: none; - } - input[type="date"]::-webkit-calendar-picker-indicator { - position: absolute; - inset-inline-end: 0.75em; - width: 1em; - height: 1em; - cursor: pointer; - } - } - } - } - .table { - @layer daisyui.l1.l2.l3 { - font-size: 0.875rem; - position: relative; - width: 100%; - border-collapse: separate; - --tw-border-spacing-x: calc(0.25rem * 0); - --tw-border-spacing-y: calc(0.25rem * 0); - border-spacing: var(--tw-border-spacing-x) var(--tw-border-spacing-y); - border-radius: var(--radius-box); - text-align: left; - &:where(:dir(rtl), [dir="rtl"], [dir="rtl"] *) { - text-align: right; - } - tr.row-hover { - &, &:nth-child(even) { - &:hover { - @media (hover: hover) { - background-color: var(--color-base-200); - } - } - } - } - :where(th, td) { - padding-inline: calc(0.25rem * 4); - padding-block: calc(0.25rem * 3); - vertical-align: middle; - } - :where(thead, tfoot) { - white-space: nowrap; - color: var(--color-base-content); - @supports (color: color-mix(in lab, red, red)) { - color: color-mix(in oklab, var(--color-base-content) 60%, transparent); - } - font-size: 0.875rem; - font-weight: 600; - } - :where(tfoot tr:first-child :is(td, th)) { - border-top: var(--border) solid var(--color-base-content); - @supports (color: color-mix(in lab, red, red)) { - border-top: var(--border) solid color-mix(in oklch, var(--color-base-content) 5%, #0000); - } - } - :where(.table-pin-rows thead tr) { - position: sticky; - top: calc(0.25rem * 0); - z-index: 1; - background-color: var(--color-base-100); - } - :where(.table-pin-rows tfoot tr) { - position: sticky; - bottom: calc(0.25rem * 0); - z-index: 1; - background-color: var(--color-base-100); - } - :where(.table-pin-cols tr th) { - position: sticky; - right: calc(0.25rem * 0); - left: calc(0.25rem * 0); - background-color: var(--color-base-100); - } - :where(thead tr :is(td, th), tbody tr:not(:last-child) :is(td, th)) { - border-bottom: var(--border) solid var(--color-base-content); - @supports (color: color-mix(in lab, red, red)) { - border-bottom: var(--border) solid color-mix(in oklch, var(--color-base-content) 5%, #0000); - } - } - } - } - .steps { - @layer daisyui.l1.l2.l3 { - display: inline-grid; - grid-auto-flow: column; - overflow: hidden; - overflow-x: auto; - counter-reset: step; - grid-auto-columns: 1fr; - .step { - display: grid; - grid-template-columns: repeat(1, minmax(0, 1fr)); - grid-template-columns: auto; - grid-template-rows: repeat(2, minmax(0, 1fr)); - grid-template-rows: 40px 1fr; - place-items: center; - text-align: center; - min-width: 4rem; - --step-bg: var(--color-base-300); - --step-fg: var(--color-base-content); - &:before { - top: calc(0.25rem * 0); - grid-column-start: 1; - grid-row-start: 1; - height: calc(0.25rem * 2); - width: 100%; - border: 1px solid; - color: var(--step-bg); - background-color: var(--step-bg); - content: ""; - margin-inline-start: -100%; - } - > .step-icon, &:not(:has(.step-icon)):after { - --tw-content: counter(step); - content: var(--tw-content); - counter-increment: step; - z-index: 1; - color: var(--step-fg); - background-color: var(--step-bg); - border: 1px solid var(--step-bg); - position: relative; - grid-column-start: 1; - grid-row-start: 1; - display: grid; - height: calc(0.25rem * 8); - width: calc(0.25rem * 8); - place-items: center; - place-self: center; - border-radius: calc(infinity * 1px); - } - &:first-child:before { - --tw-content: none; - content: var(--tw-content); - } - &[data-content]:after { - --tw-content: attr(data-content); - content: var(--tw-content); - } - } - } - @layer daisyui.l1.l2 { - .step-neutral { - + .step-neutral:before, &:after, > .step-icon { - --step-bg: var(--color-neutral); - --step-fg: var(--color-neutral-content); - } - } - .step-primary { - + .step-primary:before, &:after, > .step-icon { - --step-bg: var(--color-primary); - --step-fg: var(--color-primary-content); - } - } - .step-secondary { - + .step-secondary:before, &:after, > .step-icon { - --step-bg: var(--color-secondary); - --step-fg: var(--color-secondary-content); - } - } - .step-accent { - + .step-accent:before, &:after, > .step-icon { - --step-bg: var(--color-accent); - --step-fg: var(--color-accent-content); - } - } - .step-info { - + .step-info:before, &:after, > .step-icon { - --step-bg: var(--color-info); - --step-fg: var(--color-info-content); - } - } - .step-success { - + .step-success:before, &:after, > .step-icon { - --step-bg: var(--color-success); - --step-fg: var(--color-success-content); - } - } - .step-warning { - + .step-warning:before, &:after, > .step-icon { - --step-bg: var(--color-warning); - --step-fg: var(--color-warning-content); - } - } - .step-error { - + .step-error:before, &:after, > .step-icon { - --step-bg: var(--color-error); - --step-fg: var(--color-error-content); - } - } - } - } - .select { - @layer daisyui.l1.l2.l3 { - border: var(--border) solid #0000; - position: relative; - display: inline-flex; - flex-shrink: 1; - appearance: none; - align-items: center; - gap: calc(0.25rem * 1.5); - background-color: var(--color-base-100); - padding-inline-start: calc(0.25rem * 3); - padding-inline-end: calc(0.25rem * 7); - vertical-align: middle; - width: clamp(3rem, 20rem, 100%); - height: var(--size); - font-size: 0.875rem; - touch-action: manipulation; - border-start-start-radius: var(--join-ss, var(--radius-field)); - border-start-end-radius: var(--join-se, var(--radius-field)); - border-end-start-radius: var(--join-es, var(--radius-field)); - border-end-end-radius: var(--join-ee, var(--radius-field)); - background-image: linear-gradient(45deg, #0000 50%, currentColor 50%), linear-gradient(135deg, currentColor 50%, #0000 50%); - background-position: calc(100% - 20px) calc(1px + 50%), calc(100% - 16.1px) calc(1px + 50%); - background-size: 4px 4px, 4px 4px; - background-repeat: no-repeat; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - box-shadow: 0 1px var(--input-color) inset, 0 -1px oklch(100% 0 0 / calc(var(--depth) * 0.1)) inset; - @supports (color: color-mix(in lab, red, red)) { - box-shadow: 0 1px color-mix(in oklab, var(--input-color) calc(var(--depth) * 10%), #0000) inset, 0 -1px oklch(100% 0 0 / calc(var(--depth) * 0.1)) inset; - } - border-color: var(--input-color); - --input-color: var(--color-base-content); - @supports (color: color-mix(in lab, red, red)) { - --input-color: color-mix(in oklab, var(--color-base-content) 20%, #0000); - } - --size: calc(var(--size-field, 0.25rem) * 10); - [dir="rtl"] & { - background-position: calc(0% + 12px) calc(1px + 50%), calc(0% + 16px) calc(1px + 50%); - &::picker(select), select::picker(select) { - translate: 0.5rem 0; - } - } - &[multiple] { - height: auto; - overflow: auto; - padding-block: calc(0.25rem * 3); - padding-inline-end: calc(0.25rem * 3); - background-image: none; - } - select { - margin-inline-start: calc(0.25rem * -3); - margin-inline-end: calc(0.25rem * -7); - width: calc(100% + 2.75rem); - appearance: none; - padding-inline-start: calc(0.25rem * 3); - padding-inline-end: calc(0.25rem * 7); - height: calc(100% - calc(var(--border) * 2)); - align-items: center; - background: inherit; - border-radius: inherit; - border-style: none; - &:focus, &:focus-within { - --tw-outline-style: none; - outline-style: none; - @media (forced-colors: active) { - outline: 2px solid transparent; - outline-offset: 2px; - } - } - &:not(:last-child) { - margin-inline-end: calc(0.25rem * -5.5); - background-image: none; - } - } - &:focus, &:focus-within { - --input-color: var(--color-base-content); - box-shadow: 0 1px var(--input-color); - @supports (color: color-mix(in lab, red, red)) { - box-shadow: 0 1px color-mix(in oklab, var(--input-color) calc(var(--depth) * 10%), #0000); - } - outline: 2px solid var(--input-color); - outline-offset: 2px; - isolation: isolate; - } - &:has(> select[disabled]), &:is(:disabled, [disabled]), fieldset:disabled & { - cursor: not-allowed; - border-color: var(--color-base-200); - background-color: var(--color-base-200); - color: var(--color-base-content); - @supports (color: color-mix(in lab, red, red)) { - color: color-mix(in oklab, var(--color-base-content) 40%, transparent); - } - &::placeholder { - color: var(--color-base-content); - @supports (color: color-mix(in lab, red, red)) { - color: color-mix(in oklab, var(--color-base-content) 20%, transparent); - } - } - } - &:has(> select[disabled]) > select[disabled] { - cursor: not-allowed; - } - &, & select { - @supports (appearance: base-select) { - appearance: base-select; - } - @supports (appearance: base-select) { - &::picker(select) { - appearance: base-select; - } - } - &::picker(select) { - color: inherit; - max-height: min(24rem, 70dvh); - margin-inline: 0.5rem; - translate: -0.5rem 0; - border: var(--border) solid var(--color-base-200); - margin-block: calc(0.25rem * 2); - border-radius: var(--radius-box); - padding: calc(0.25rem * 2); - background-color: inherit; - box-shadow: 0 2px calc(var(--depth) * 3px) -2px oklch(0% 0 0/0.2); - box-shadow: 0 20px 25px -5px rgb(0 0 0 / calc(var(--depth) * 0.1)), 0 8px 10px -6px rgb(0 0 0 / calc(var(--depth) * 0.1)); - } - &::picker-icon { - display: none; - } - optgroup { - padding-top: 0.5em; - option { - &:nth-child(1) { - margin-top: 0.5em; - } - } - } - option { - border-radius: var(--radius-field); - padding-inline: calc(0.25rem * 3); - padding-block: calc(0.25rem * 1.5); - transition-property: color, background-color; - transition-duration: 0.2s; - transition-timing-function: cubic-bezier(0, 0, 0.2, 1); - white-space: normal; - &:not(:disabled) { - &:hover, &:focus-visible { - cursor: pointer; - background-color: var(--color-base-content); - @supports (color: color-mix(in lab, red, red)) { - background-color: color-mix(in oklab, var(--color-base-content) 10%, transparent); - } - --tw-outline-style: none; - outline-style: none; - @media (forced-colors: active) { - outline: 2px solid transparent; - outline-offset: 2px; - } - } - &:active { - background-color: var(--color-neutral); - color: var(--color-neutral-content); - box-shadow: 0 2px calc(var(--depth) * 3px) -2px var(--color-neutral); - } - } - } - } - } - } - .checkbox { - @layer daisyui.l1.l2.l3 { - border: var(--border) solid var(--input-color, var(--color-base-content)); - @supports (color: color-mix(in lab, red, red)) { - border: var(--border) solid var(--input-color, color-mix(in oklab, var(--color-base-content) 20%, #0000)); - } - position: relative; - display: inline-block; - flex-shrink: 0; - cursor: pointer; - appearance: none; - border-radius: var(--radius-selector); - padding: calc(0.25rem * 1); - vertical-align: middle; - color: var(--color-base-content); - box-shadow: 0 1px oklch(0% 0 0 / calc(var(--depth) * 0.1)) inset, 0 0 #0000 inset, 0 0 #0000; - transition: background-color 0.2s, box-shadow 0.2s; - --size: calc(var(--size-selector, 0.25rem) * 6); - width: var(--size); - height: var(--size); - background-size: auto, calc(var(--noise) * 100%); - background-image: none, var(--fx-noise); - &:before { - --tw-content: ""; - content: var(--tw-content); - display: block; - width: 100%; - height: 100%; - rotate: 45deg; - background-color: currentcolor; - opacity: 0%; - transition: clip-path 0.3s, opacity 0.1s, rotate 0.3s, translate 0.3s; - transition-delay: 0.1s; - clip-path: polygon(20% 100%, 20% 80%, 50% 80%, 50% 80%, 70% 80%, 70% 100%); - box-shadow: 0px 3px 0 0px oklch(100% 0 0 / calc(var(--depth) * 0.1)) inset; - font-size: 1rem; - line-height: 0.75; - } - &:focus-visible { - outline: 2px solid var(--input-color, currentColor); - outline-offset: 2px; - } - &:checked, &[aria-checked="true"] { - background-color: var(--input-color, #0000); - box-shadow: 0 0 #0000 inset, 0 8px 0 -4px oklch(100% 0 0 / calc(var(--depth) * 0.1)) inset, 0 1px oklch(0% 0 0 / calc(var(--depth) * 0.1)); - &:before { - clip-path: polygon(20% 100%, 20% 80%, 50% 80%, 50% 0%, 70% 0%, 70% 100%); - opacity: 100%; - } - @media (forced-colors: active) { - &:before { - rotate: 0deg; - background-color: transparent; - --tw-content: "✔︎"; - clip-path: none; - } - } - @media print { - &:before { - rotate: 0deg; - background-color: transparent; - --tw-content: "✔︎"; - clip-path: none; - } - } - } - &:indeterminate { - background-color: var( --input-color, var(--color-base-content) ); - @supports (color: color-mix(in lab, red, red)) { - background-color: var( --input-color, color-mix(in oklab, var(--color-base-content) 20%, #0000) ); - } - &:before { - rotate: 0deg; - opacity: 100%; - translate: 0 -35%; - clip-path: polygon(20% 100%, 20% 80%, 50% 80%, 50% 80%, 80% 80%, 80% 100%); - } - } - } - &:disabled { - @layer daisyui.l1.l2 { - cursor: not-allowed; - opacity: 20%; - } - } - } - .radio { - @layer daisyui.l1.l2.l3 { - position: relative; - display: inline-block; - flex-shrink: 0; - cursor: pointer; - appearance: none; - border-radius: calc(infinity * 1px); - padding: calc(0.25rem * 1); - vertical-align: middle; - border: var(--border) solid var(--input-color, currentColor); - @supports (color: color-mix(in lab, red, red)) { - border: var(--border) solid var(--input-color, color-mix(in srgb, currentColor 20%, #0000)); - } - box-shadow: 0 1px oklch(0% 0 0 / calc(var(--depth) * 0.1)) inset; - --size: calc(var(--size-selector, 0.25rem) * 6); - width: var(--size); - height: var(--size); - color: var(--input-color, currentColor); - &:before { - display: block; - width: 100%; - height: 100%; - border-radius: calc(infinity * 1px); - --tw-content: ""; - content: var(--tw-content); - background-size: auto, calc(var(--noise) * 100%); - background-image: none, var(--fx-noise); - } - &:focus-visible { - outline: 2px solid currentColor; - } - &:checked, &[aria-checked="true"] { - border-color: currentcolor; - background-color: var(--color-base-100); - @media (prefers-reduced-motion: no-preference) { - animation: radio 0.2s ease-out; - } - &:before { - background-color: currentcolor; - box-shadow: 0 -1px oklch(0% 0 0 / calc(var(--depth) * 0.1)) inset, 0 8px 0 -4px oklch(100% 0 0 / calc(var(--depth) * 0.1)) inset, 0 1px oklch(0% 0 0 / calc(var(--depth) * 0.1)); - } - @media (forced-colors: active) { - &:before { - outline-style: var(--tw-outline-style); - outline-width: 1px; - outline-offset: calc(1px * -1); - } - } - @media print { - &:before { - outline: 0.25rem solid; - outline-offset: -1rem; - } - } - } - } - &:disabled { - @layer daisyui.l1.l2 { - cursor: not-allowed; - opacity: 20%; - } - } - } - .navbar { - @layer daisyui.l1.l2.l3 { - display: flex; - width: 100%; - align-items: center; - padding: 0.5rem; - min-height: 4rem; - } - :where(&) { - @layer daisyui.l1.l2 { - position: relative; - } - } - } - .drawer { - @layer daisyui.l1.l2.l3 { - position: relative; - display: grid; - width: 100%; - grid-auto-columns: max-content auto; - } - } - .absolute { - position: absolute; - } - .static { - position: static; - } - .tooltip-bottom { - @layer daisyui.l1.l2 { - > .tooltip-content, &[data-tip]:before { - transform: translateX(-50%) translateY(var(--tt-pos, -0.25rem)); - inset: var(--tt-off) auto auto 50%; - } - &:after { - transform: translateX(-50%) translateY(var(--tt-pos, -0.25rem)) rotate(180deg); - inset: var(--tt-tail) auto auto 50%; - } - } - } - .tooltip-left { - @layer daisyui.l1.l2 { - > .tooltip-content, &[data-tip]:before { - transform: translateX(calc(var(--tt-pos, 0.25rem) - 0.25rem)) translateY(-50%); - inset: 50% var(--tt-off) auto auto; - } - &:after { - transform: translateX(var(--tt-pos, 0.25rem)) translateY(-50%) rotate(-90deg); - inset: 50% calc(var(--tt-tail) + 1px) auto auto; - } - } - } - .tooltip-right { - @layer daisyui.l1.l2 { - > .tooltip-content, &[data-tip]:before { - transform: translateX(calc(var(--tt-pos, -0.25rem) + 0.25rem)) translateY(-50%); - inset: 50% auto auto var(--tt-off); - } - &:after { - transform: translateX(var(--tt-pos, -0.25rem)) translateY(-50%) rotate(90deg); - inset: 50% auto auto calc(var(--tt-tail) + 1px); - } - } - } - .dropdown-top { - @layer daisyui.l1.l2 { - --anchor-v: top; - .dropdown-content { - top: auto; - bottom: 100%; - transform-origin: bottom; - } - } - } - .top-2 { - top: calc(var(--spacing) * 2); - } - .right-2 { - right: calc(var(--spacing) * 2); - } - .bottom-0 { - bottom: calc(var(--spacing) * 0); - } - .left-0 { - left: calc(var(--spacing) * 0); - } - .join { - display: inline-flex; - align-items: stretch; - --join-ss: 0; - --join-se: 0; - --join-es: 0; - --join-ee: 0; - :where(.join-item) { - border-start-start-radius: var(--join-ss, 0); - border-start-end-radius: var(--join-se, 0); - border-end-start-radius: var(--join-es, 0); - border-end-end-radius: var(--join-ee, 0); - * { - --join-ss: var(--radius-field); - --join-se: var(--radius-field); - --join-es: var(--radius-field); - --join-ee: var(--radius-field); - } - } - > .join-item:where(:first-child) { - --join-ss: var(--radius-field); - --join-se: 0; - --join-es: var(--radius-field); - --join-ee: 0; - } - :first-child:not(:last-child) { - :where(.join-item) { - --join-ss: var(--radius-field); - --join-se: 0; - --join-es: var(--radius-field); - --join-ee: 0; - } - } - > .join-item:where(:last-child) { - --join-ss: 0; - --join-se: var(--radius-field); - --join-es: 0; - --join-ee: var(--radius-field); - } - :last-child:not(:first-child) { - :where(.join-item) { - --join-ss: 0; - --join-se: var(--radius-field); - --join-es: 0; - --join-ee: var(--radius-field); - } - } - > .join-item:where(:only-child) { - --join-ss: var(--radius-field); - --join-se: var(--radius-field); - --join-es: var(--radius-field); - --join-ee: var(--radius-field); - } - :only-child { - :where(.join-item) { - --join-ss: var(--radius-field); - --join-se: var(--radius-field); - --join-es: var(--radius-field); - --join-ee: var(--radius-field); - } - } - > :where(:focus, :has(:focus)) { - z-index: 1; - } - @media (hover: hover) { - > :where(.btn:hover, :has(.btn:hover)) { - isolation: isolate; - } - } - } - .z-1 { - z-index: 1; - } - .col-span-2 { - grid-column: span 2 / span 2; - } - .col-span-3 { - grid-column: span 3 / span 3; - } - .modal-box { - @layer daisyui.l1.l2.l3 { - grid-column-start: 1; - grid-row-start: 1; - max-height: 100vh; - width: calc(11/12 * 100%); - max-width: 32rem; - background-color: var(--color-base-100); - padding: calc(0.25rem * 6); - transition: translate 0.3s ease-out, scale 0.3s ease-out, opacity 0.2s ease-out 0.05s, box-shadow 0.3s ease-out; - border-top-left-radius: var(--modal-tl, var(--radius-box)); - border-top-right-radius: var(--modal-tr, var(--radius-box)); - border-bottom-left-radius: var(--modal-bl, var(--radius-box)); - border-bottom-right-radius: var(--modal-br, var(--radius-box)); - scale: 95%; - opacity: 0; - box-shadow: oklch(0% 0 0/ 0.25) 0px 25px 50px -12px; - overflow-y: auto; - overscroll-behavior: contain; - } - } - .drawer-content { - @layer daisyui.l1.l2.l3 { - grid-column-start: 2; - grid-row-start: 1; - min-width: calc(0.25rem * 0); - } - } - .container { - width: 100%; - @media (width >= 40rem) { - max-width: 40rem; - } - @media (width >= 48rem) { - max-width: 48rem; - } - @media (width >= 64rem) { - max-width: 64rem; - } - @media (width >= 80rem) { - max-width: 80rem; - } - @media (width >= 96rem) { - max-width: 96rem; - } - } - .divider { - @layer daisyui.l1.l2.l3 { - display: flex; - height: calc(0.25rem * 4); - flex-direction: row; - align-items: center; - align-self: stretch; - white-space: nowrap; - margin: var(--divider-m, 1rem 0); - --divider-color: var(--color-base-content); - @supports (color: color-mix(in lab, red, red)) { - --divider-color: color-mix(in oklab, var(--color-base-content) 10%, transparent); - } - &:before, &:after { - content: ""; - height: calc(0.25rem * 0.5); - width: 100%; - flex-grow: 1; - background-color: var(--divider-color); - } - @media print { - &:before, &:after { - border: 0.5px solid; - } - } - &:not(:empty) { - gap: calc(0.25rem * 4); - } - } - } - .m-1 { - margin: calc(var(--spacing) * 1); - } - .m-6 { - margin: calc(var(--spacing) * 6); - } - .filter { - @layer daisyui.l1.l2.l3 { - display: flex; - flex-wrap: wrap; - input[type="radio"] { - width: auto; - } - input { - overflow: hidden; - opacity: 100%; - scale: 1; - transition: margin 0.1s, opacity 0.3s, padding 0.3s, border-width 0.1s; - &:not(:last-child) { - margin-inline-end: calc(0.25rem * 1); - } - &.filter-reset { - aspect-ratio: 1 / 1; - &::after { - --tw-content: "×"; - content: var(--tw-content); - } - } - } - &:not(:has(input:checked:not(.filter-reset))) { - .filter-reset, input[type="reset"] { - scale: 0; - border-width: 0; - margin-inline: calc(0.25rem * 0); - width: calc(0.25rem * 0); - padding-inline: calc(0.25rem * 0); - opacity: 0%; - } - } - &:has(input:checked:not(.filter-reset)) { - input:not(:checked, .filter-reset, input[type="reset"]) { - scale: 0; - border-width: 0; - margin-inline: calc(0.25rem * 0); - width: calc(0.25rem * 0); - padding-inline: calc(0.25rem * 0); - opacity: 0%; - } - } - } - } - .mx-auto { - margin-inline: auto; - } - .my-1\.5 { - margin-block: calc(var(--spacing) * 1.5); - } - .my-6 { - margin-block: calc(var(--spacing) * 6); - } - .my-auto { - margin-block: auto; - } - .label { - @layer daisyui.l1.l2.l3 { - display: inline-flex; - align-items: center; - gap: calc(0.25rem * 1.5); - white-space: nowrap; - color: currentcolor; - @supports (color: color-mix(in lab, red, red)) { - color: color-mix(in oklab, currentcolor 60%, transparent); - } - &:has(input) { - cursor: pointer; - } - &:is(.input > *, .select > *) { - display: flex; - height: calc(100% - 0.5rem); - align-items: center; - padding-inline: calc(0.25rem * 3); - white-space: nowrap; - font-size: inherit; - &:first-child { - margin-inline-start: calc(0.25rem * -3); - margin-inline-end: calc(0.25rem * 3); - border-inline-end: var(--border) solid currentColor; - @supports (color: color-mix(in lab, red, red)) { - border-inline-end: var(--border) solid color-mix(in oklab, currentColor 10%, #0000); - } - } - &:last-child { - margin-inline-start: calc(0.25rem * 3); - margin-inline-end: calc(0.25rem * -3); - border-inline-start: var(--border) solid currentColor; - @supports (color: color-mix(in lab, red, red)) { - border-inline-start: var(--border) solid color-mix(in oklab, currentColor 10%, #0000); - } - } - } - } - } - .join-item { - &:where(*:not(:first-child, :disabled, [disabled], .btn-disabled)) { - margin-inline-start: calc(var(--border, 1px) * -1); - margin-block-start: 0; - } - &:where(*:is(:disabled, [disabled], .btn-disabled)) { - border-width: var(--border, 1px) 0 var(--border, 1px) var(--border, 1px); - } - } - .me-2 { - margin-inline-end: calc(var(--spacing) * 2); - } - .me-4 { - margin-inline-end: calc(var(--spacing) * 4); - } - .me-6 { - margin-inline-end: calc(var(--spacing) * 6); - } - .me-\[140px\] { - margin-inline-end: 140px; - } - .-mt-2 { - margin-top: calc(var(--spacing) * -2); - } - .mt-4 { - margin-top: calc(var(--spacing) * 4); - } - .mt-6 { - margin-top: calc(var(--spacing) * 6); - } - .mb-4 { - margin-bottom: calc(var(--spacing) * 4); - } - .mb-6 { - margin-bottom: calc(var(--spacing) * 6); - } - .mb-auto { - margin-bottom: auto; - } - .status { - @layer daisyui.l1.l2.l3 { - display: inline-block; - aspect-ratio: 1 / 1; - width: calc(0.25rem * 2); - height: calc(0.25rem * 2); - border-radius: var(--radius-selector); - background-color: var(--color-base-content); - @supports (color: color-mix(in lab, red, red)) { - background-color: color-mix(in oklab, var(--color-base-content) 20%, transparent); - } - background-position: center; - background-repeat: no-repeat; - vertical-align: middle; - color: color-mix(in srgb, #000 30%, transparent); - @supports (color: color-mix(in lab, red, red)) { - color: color-mix(in oklab, var(--color-black) 30%, transparent); - } - background-image: radial-gradient( circle at 35% 30%, oklch(1 0 0 / calc(var(--depth) * 0.5)), #0000 ); - box-shadow: 0 2px 3px -1px currentColor; - @supports (color: color-mix(in lab, red, red)) { - box-shadow: 0 2px 3px -1px color-mix(in oklab, currentColor calc(var(--depth) * 100%), #0000); - } - } - } - .badge { - @layer daisyui.l1.l2.l3 { - display: inline-flex; - align-items: center; - justify-content: center; - gap: calc(0.25rem * 2); - border-radius: var(--radius-selector); - vertical-align: middle; - color: var(--badge-fg); - border: var(--border) solid var(--badge-color, var(--color-base-200)); - font-size: 0.875rem; - width: fit-content; - background-size: auto, calc(var(--noise) * 100%); - background-image: none, var(--fx-noise); - background-color: var(--badge-bg); - --badge-bg: var(--badge-color, var(--color-base-100)); - --badge-fg: var(--color-base-content); - --size: calc(var(--size-selector, 0.25rem) * 6); - height: var(--size); - padding-inline: calc(var(--size) / 2 - var(--border)); - } - } - .footer { - @layer daisyui.l1.l2.l3 { - display: grid; - width: 100%; - grid-auto-flow: row; - place-items: start; - column-gap: calc(0.25rem * 4); - row-gap: calc(0.25rem * 10); - font-size: 0.875rem; - line-height: 1.25rem; - & > * { - display: grid; - place-items: start; - gap: calc(0.25rem * 2); - } - &.footer-center { - grid-auto-flow: column dense; - place-items: center; - text-align: center; - & > * { - place-items: center; - } - } - } - } - .block { - display: block; - } - .contents { - display: contents; - } - .flex { - display: flex; - } - .grid { - display: grid; - } - .hidden { - display: none; - } - .inline { - display: inline; - } - .inline-block { - display: inline-block; - } - .table { - display: table; - } - .btn-circle { - @layer daisyui.l1.l2 { - border-radius: calc(infinity * 1px); - padding-inline: calc(0.25rem * 0); - width: var(--size); - height: var(--size); - } - } - .btn-square { - @layer daisyui.l1.l2 { - padding-inline: calc(0.25rem * 0); - width: var(--size); - height: var(--size); - } - } - .size-7 { - width: calc(var(--spacing) * 7); - height: calc(var(--spacing) * 7); - } - .h-\[1em\] { - height: 1em; - } - .h-fit { - height: fit-content; - } - .h-full { - height: 100%; - } - .min-h-screen { - min-height: 100vh; - } - .btn-block { - @layer daisyui.l1.l2 { - width: 100%; - } - } - .loading-lg { - @layer daisyui.l1.l2 { - width: calc(var(--size-selector, 0.25rem) * 7); - } - } - .w-\[330px\] { - width: 330px; - } - .w-fit { - width: fit-content; - } - .w-full { - width: 100%; - } - .min-w-\[200px\] { - min-width: 200px; - } - .min-w-\[220px\] { - min-width: 220px; - } - .min-w-full { - min-width: 100%; - } - .flex-1 { - flex: 1; - } - .flex-none { - flex: none; - } - .grow { - flex-grow: 1; - } - .link { - @layer daisyui.l1.l2.l3 { - cursor: pointer; - text-decoration-line: underline; - &:focus { - --tw-outline-style: none; - outline-style: none; - @media (forced-colors: active) { - outline: 2px solid transparent; - outline-offset: 2px; - } - } - &:focus-visible { - outline: 2px solid currentColor; - outline-offset: 2px; - } - } - } - .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)); - } - .flex-col { - flex-direction: column; - } - .flex-wrap { - flex-wrap: wrap; - } - .items-center { - align-items: center; - } - .items-end { - align-items: flex-end; - } - .items-start { - align-items: flex-start; - } - .justify-between { - justify-content: space-between; - } - .justify-center { - justify-content: center; - } - .justify-end { - justify-content: flex-end; - } - .justify-start { - justify-content: flex-start; - } - .gap-1 { - gap: calc(var(--spacing) * 1); - } - .gap-2 { - gap: calc(var(--spacing) * 2); - } - .gap-4 { - gap: calc(var(--spacing) * 4); - } - .space-y-1 { - :where(& > :not(:last-child)) { - --tw-space-y-reverse: 0; - margin-block-start: calc(calc(var(--spacing) * 1) * var(--tw-space-y-reverse)); - margin-block-end: calc(calc(var(--spacing) * 1) * calc(1 - var(--tw-space-y-reverse))); - } - } - .space-y-2 { - :where(& > :not(:last-child)) { - --tw-space-y-reverse: 0; - margin-block-start: calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse)); - margin-block-end: calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse))); - } - } - .space-y-4 { - :where(& > :not(:last-child)) { - --tw-space-y-reverse: 0; - margin-block-start: calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse)); - margin-block-end: calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse))); - } - } - .space-y-6 { - :where(& > :not(:last-child)) { - --tw-space-y-reverse: 0; - margin-block-start: calc(calc(var(--spacing) * 6) * var(--tw-space-y-reverse)); - margin-block-end: calc(calc(var(--spacing) * 6) * calc(1 - var(--tw-space-y-reverse))); - } - } - .space-x-2 { - :where(& > :not(:last-child)) { - --tw-space-x-reverse: 0; - margin-inline-start: calc(calc(var(--spacing) * 2) * var(--tw-space-x-reverse)); - margin-inline-end: calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-x-reverse))); - } - } - .space-x-4 { - :where(& > :not(:last-child)) { - --tw-space-x-reverse: 0; - margin-inline-start: calc(calc(var(--spacing) * 4) * var(--tw-space-x-reverse)); - margin-inline-end: calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-x-reverse))); - } - } - .space-x-6 { - :where(& > :not(:last-child)) { - --tw-space-x-reverse: 0; - margin-inline-start: calc(calc(var(--spacing) * 6) * var(--tw-space-x-reverse)); - margin-inline-end: calc(calc(var(--spacing) * 6) * calc(1 - var(--tw-space-x-reverse))); - } - } - .gap-y-4 { - row-gap: calc(var(--spacing) * 4); - } - .overflow-auto { - overflow: auto; - } - .rounded-box { - border-radius: var(--radius-box); - } - .rounded-box { - border-radius: var(--radius-box); - } - .rounded-lg { - border-radius: var(--radius-lg); - } - .rounded-sm { - border-radius: var(--radius-sm); - } - .border { - border-style: var(--tw-border-style); - border-width: 1px; - } - .border-2 { - border-style: var(--tw-border-style); - border-width: 2px; - } - .border-b-1 { - border-bottom-style: var(--tw-border-style); - border-bottom-width: 1px; - } - .badge-outline { - @layer daisyui.l1.l2 { - color: var(--badge-color); - --badge-bg: #0000; - background-image: none; - border-color: currentColor; - } - } - .border-error { - border-color: var(--color-error); - } - .border-gray-200 { - border-color: var(--color-gray-200); - } - .border-primary { - border-color: var(--color-primary); - } - .table-zebra { - @layer daisyui.l1.l2 { - tbody { - tr { - &:where(:nth-child(even)) { - background-color: var(--color-base-200); - :where(.table-pin-cols tr th) { - background-color: var(--color-base-200); - } - } - &.row-hover { - &, &:where(:nth-child(even)) { - &:hover { - @media (hover: hover) { - background-color: var(--color-base-300); - } - } - } - } - } - } - } - } - .bg-base-300 { - background-color: var(--color-base-300); - } - .bg-error { - background-color: var(--color-error); - } - .bg-secondary { - background-color: var(--color-secondary); - } - .loading-spinner { - @layer daisyui.l1.l2 { - mask-image: url("data:image/svg+xml,%3Csvg width='24' height='24' stroke='black' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cg transform-origin='center'%3E%3Ccircle cx='12' cy='12' r='9.5' fill='none' stroke-width='3' stroke-linecap='round'%3E%3CanimateTransform attributeName='transform' type='rotate' from='0 12 12' to='360 12 12' dur='2s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dasharray' values='0,150;42,150;42,150' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dashoffset' values='0;-16;-59' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3C/circle%3E%3C/g%3E%3C/svg%3E"); - } - } - .p-2 { - padding: calc(var(--spacing) * 2); - } - .p-4 { - padding: calc(var(--spacing) * 4); - } - .p-6 { - padding: calc(var(--spacing) * 6); - } - .px-4 { - padding-inline: calc(var(--spacing) * 4); - } - .py-2 { - padding-block: calc(var(--spacing) * 2); - } - .ps-2 { - padding-inline-start: calc(var(--spacing) * 2); - } - .pe-2 { - padding-inline-end: calc(var(--spacing) * 2); - } - .pt-2 { - padding-top: calc(var(--spacing) * 2); - } - .pb-6 { - padding-bottom: calc(var(--spacing) * 6); - } - .text-2xl { - font-size: var(--text-2xl); - line-height: var(--tw-leading, var(--text-2xl--line-height)); - } - .text-3xl { - font-size: var(--text-3xl); - line-height: var(--tw-leading, var(--text-3xl--line-height)); - } - .text-lg { - font-size: var(--text-lg); - line-height: var(--tw-leading, var(--text-lg--line-height)); - } - .text-sm { - font-size: var(--text-sm); - line-height: var(--tw-leading, var(--text-sm--line-height)); - } - .text-xl { - font-size: var(--text-xl); - line-height: var(--tw-leading, var(--text-xl--line-height)); - } - .badge-lg { - @layer daisyui.l1.l2 { - --size: calc(var(--size-selector, 0.25rem) * 7); - font-size: 1rem; - } - } - .font-bold { - --tw-font-weight: var(--font-weight-bold); - font-weight: var(--font-weight-bold); - } - .text-base-content { - color: var(--color-base-content); - } - .text-error { - color: var(--color-error); - } - .text-gray-400 { - color: var(--color-gray-400); - } - .text-green-400 { - color: var(--color-green-400); - } - .text-info { - color: var(--color-info); - } - .text-success { - color: var(--color-success); - } - .lowercase { - text-transform: lowercase; - } - .uppercase { - text-transform: uppercase; - } - .italic { - font-style: italic; - } - .btn-link { - @layer daisyui.l1 { - text-decoration-line: underline; - outline-color: currentcolor; - --btn-border: #0000; - --btn-bg: #0000; - --btn-noise: none; - --btn-shadow: ""; - &:not(.btn-disabled, .btn:disabled, .btn[disabled]) { - --btn-fg: var(--btn-color, var(--color-primary)); - } - &:is(.btn-active, :hover, :active:focus, :focus-visible) { - --btn-border: #0000; - --btn-bg: #0000; - } - } - } - .opacity-50 { - opacity: 50%; - } - .shadow-2xl { - --tw-shadow: 0 25px 50px -12px var(--tw-shadow-color, rgb(0 0 0 / 0.25)); - box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow); - } - .shadow-sm { - --tw-shadow: 0 1px 3px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 1px 2px -1px var(--tw-shadow-color, rgb(0 0 0 / 0.1)); - box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow); - } - .btn-ghost { - @layer daisyui.l1 { - &:not(.btn-active, :hover, :active:focus, :focus-visible, input:checked:not(.filter .btn)) { - --btn-shadow: ""; - --btn-bg: #0000; - --btn-border: #0000; - --btn-noise: none; - &:not(:disabled, [disabled], .btn-disabled) { - outline-color: currentcolor; - --btn-fg: var(--btn-color, currentColor); - } - } - @media (hover: none) { - &:not(.btn-active, :active, :focus-visible, input:checked:not(.filter .btn)):hover { - outline-color: currentcolor; - --btn-shadow: ""; - --btn-bg: #0000; - --btn-fg: var(--btn-color, currentColor); - --btn-border: #0000; - --btn-noise: none; - } - } - } - } - .filter { - filter: var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,); - } - .btn-sm { - @layer daisyui.l1.l2 { - --fontsize: 0.75rem; - --btn-p: 0.75rem; - --size: calc(var(--size-field, 0.25rem) * 8); - } - } - .badge-error { - @layer daisyui.l1.l2 { - --badge-color: var(--color-error); - --badge-fg: var(--color-error-content); - } - } - .badge-info { - @layer daisyui.l1.l2 { - --badge-color: var(--color-info); - --badge-fg: var(--color-info-content); - } - } - .badge-primary { - @layer daisyui.l1.l2 { - --badge-color: var(--color-primary); - --badge-fg: var(--color-primary-content); - } - } - .badge-secondary { - @layer daisyui.l1.l2 { - --badge-color: var(--color-secondary); - --badge-fg: var(--color-secondary-content); - } - } - .badge-success { - @layer daisyui.l1.l2 { - --badge-color: var(--color-success); - --badge-fg: var(--color-success-content); - } - } - .btn-error { - @layer daisyui.l1.l2.l3 { - --btn-color: var(--color-error); - --btn-fg: var(--color-error-content); - } - } - .btn-primary { - @layer daisyui.l1.l2.l3 { - --btn-color: var(--color-primary); - --btn-fg: var(--color-primary-content); - } - } - .btn-secondary { - @layer daisyui.l1.l2.l3 { - --btn-color: var(--color-secondary); - --btn-fg: var(--color-secondary-content); - } - } - .btn-success { - @layer daisyui.l1.l2.l3 { - --btn-color: var(--color-success); - --btn-fg: var(--color-success-content); - } - } - .hover\:bg-neutral { - &:hover { - @media (hover: hover) { - background-color: var(--color-neutral); - } - } - } - .hover\:text-white { - &:hover { - @media (hover: hover) { - color: var(--color-white); - } - } - } - .data-active\:bg-neutral { - &[data-active] { - background-color: var(--color-neutral); - } - } - .data-active\:text-white { - &[data-active] { - color: var(--color-white); - } - } - .sm\:footer-horizontal { - @media (width >= 40rem) { - @layer daisyui.l1.l2 { - grid-auto-flow: column; - &.footer-center { - grid-auto-flow: row dense; - } - } - } - } - .md\:grid-cols-2 { - @media (width >= 48rem) { - grid-template-columns: repeat(2, minmax(0, 1fr)); - } - } - .md\:grid-cols-3 { - @media (width >= 48rem) { - grid-template-columns: repeat(3, minmax(0, 1fr)); - } - } - .lg\:drawer-open { - @media (width >= 64rem) { - @layer daisyui.l1.l2.l3 { - > .drawer-toggle:checked { - ~ .drawer-side { - scrollbar-color: revert-layer; - } - :root:has(&) { - --page-overflow: revert-layer; - --page-scroll-gutter: revert-layer; - --page-scroll-bg: revert-layer; - --page-scroll-transition: revert-layer; - --page-has-backdrop: revert-layer; - animation: revert-layer; - animation-timeline: revert-layer; - } - } - } - @layer daisyui.l1.l2 { - > .drawer-side { - overflow-y: auto; - } - > .drawer-toggle { - display: none; - ~ .drawer-side { - pointer-events: auto; - visibility: visible; - position: sticky; - display: block; - width: auto; - overscroll-behavior: auto; - opacity: 100%; - > .drawer-overlay { - cursor: default; - background-color: transparent; - } - } - &:checked ~ .drawer-side { - pointer-events: auto; - visibility: visible; - } - } - } - @layer daisyui.l1 { - > .drawer-toggle ~ .drawer-side > :not(.drawer-overlay) { - translate: 0%; - [dir="rtl"] & { - translate: 0%; - } - } - } - } - } - .lg\:grid-cols-4 { - @media (width >= 64rem) { - grid-template-columns: repeat(4, minmax(0, 1fr)); - } - } - .is-drawer-close\:mx-auto { - &:where(.drawer-toggle:not(:checked) ~ .drawer-side, .drawer-toggle:not(:checked) ~ .drawer-side *) { - margin-inline: auto; - } - } - .is-drawer-close\:hidden { - &:where(.drawer-toggle:not(:checked) ~ .drawer-side, .drawer-toggle:not(:checked) ~ .drawer-side *) { - display: none; - } - } - .is-drawer-close\:min-w-\[80px\] { - &:where(.drawer-toggle:not(:checked) ~ .drawer-side, .drawer-toggle:not(:checked) ~ .drawer-side *) { - min-width: 80px; - } - } - .is-drawer-close\:grid-cols-1 { - &:where(.drawer-toggle:not(:checked) ~ .drawer-side, .drawer-toggle:not(:checked) ~ .drawer-side *) { - grid-template-columns: repeat(1, minmax(0, 1fr)); - } - } - .is-drawer-close\:justify-center { - &:where(.drawer-toggle:not(:checked) ~ .drawer-side, .drawer-toggle:not(:checked) ~ .drawer-side *) { - justify-content: center; - } - } - .is-drawer-close\:space-y-2 { - &:where(.drawer-toggle:not(:checked) ~ .drawer-side, .drawer-toggle:not(:checked) ~ .drawer-side *) { - :where(& > :not(:last-child)) { - --tw-space-y-reverse: 0; - margin-block-start: calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse)); - margin-block-end: calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse))); - } - } - } - .is-drawer-close\:overflow-visible { - &:where(.drawer-toggle:not(:checked) ~ .drawer-side, .drawer-toggle:not(:checked) ~ .drawer-side *) { - overflow: visible; - } - } - .is-drawer-close\:text-error { - &:where(.drawer-toggle:not(:checked) ~ .drawer-side, .drawer-toggle:not(:checked) ~ .drawer-side *) { - color: var(--color-error); - } - } - .is-drawer-close\:text-green-400 { - &:where(.drawer-toggle:not(:checked) ~ .drawer-side, .drawer-toggle:not(:checked) ~ .drawer-side *) { - color: var(--color-green-400); - } - } - .is-drawer-open\:flex { - &:where(.drawer-toggle:checked ~ .drawer-side, .drawer-toggle:checked ~ .drawer-side *) { - display: flex; - } - } - .is-drawer-open\:max-w-\[300px\] { - &:where(.drawer-toggle:checked ~ .drawer-side, .drawer-toggle:checked ~ .drawer-side *) { - max-width: 300px; - } - } - .is-drawer-open\:justify-start { - &:where(.drawer-toggle:checked ~ .drawer-side, .drawer-toggle:checked ~ .drawer-side *) { - justify-content: flex-start; - } - } - .is-drawer-open\:space-x-4 { - &:where(.drawer-toggle:checked ~ .drawer-side, .drawer-toggle:checked ~ .drawer-side *) { - :where(& > :not(:last-child)) { - --tw-space-x-reverse: 0; - margin-inline-start: calc(calc(var(--spacing) * 4) * var(--tw-space-x-reverse)); - margin-inline-end: calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-x-reverse))); - } - } - } -} -@layer base { - :where(:root),:root:has(input.theme-controller[value=light]:checked),[data-theme=light] { - color-scheme: light; - --color-base-100: oklch(100% 0 0); - --color-base-200: oklch(98% 0 0); - --color-base-300: oklch(95% 0 0); - --color-base-content: oklch(21% 0.006 285.885); - --color-primary: oklch(45% 0.24 277.023); - --color-primary-content: oklch(93% 0.034 272.788); - --color-secondary: oklch(65% 0.241 354.308); - --color-secondary-content: oklch(94% 0.028 342.258); - --color-accent: oklch(77% 0.152 181.912); - --color-accent-content: oklch(38% 0.063 188.416); - --color-neutral: oklch(14% 0.005 285.823); - --color-neutral-content: oklch(92% 0.004 286.32); - --color-info: oklch(74% 0.16 232.661); - --color-info-content: oklch(29% 0.066 243.157); - --color-success: oklch(76% 0.177 163.223); - --color-success-content: oklch(37% 0.077 168.94); - --color-warning: oklch(82% 0.189 84.429); - --color-warning-content: oklch(41% 0.112 45.904); - --color-error: oklch(71% 0.194 13.428); - --color-error-content: oklch(27% 0.105 12.094); - --radius-selector: 0.5rem; - --radius-field: 0.25rem; - --radius-box: 0.5rem; - --size-selector: 0.25rem; - --size-field: 0.25rem; - --border: 1px; - --depth: 1; - --noise: 0; - } -} -@layer base { - @media (prefers-color-scheme: dark) { - :root:not([data-theme]) { - color-scheme: dark; - --color-base-100: oklch(25.33% 0.016 252.42); - --color-base-200: oklch(23.26% 0.014 253.1); - --color-base-300: oklch(21.15% 0.012 254.09); - --color-base-content: oklch(97.807% 0.029 256.847); - --color-primary: oklch(58% 0.233 277.117); - --color-primary-content: oklch(96% 0.018 272.314); - --color-secondary: oklch(65% 0.241 354.308); - --color-secondary-content: oklch(94% 0.028 342.258); - --color-accent: oklch(77% 0.152 181.912); - --color-accent-content: oklch(38% 0.063 188.416); - --color-neutral: oklch(14% 0.005 285.823); - --color-neutral-content: oklch(92% 0.004 286.32); - --color-info: oklch(74% 0.16 232.661); - --color-info-content: oklch(29% 0.066 243.157); - --color-success: oklch(76% 0.177 163.223); - --color-success-content: oklch(37% 0.077 168.94); - --color-warning: oklch(82% 0.189 84.429); - --color-warning-content: oklch(41% 0.112 45.904); - --color-error: oklch(71% 0.194 13.428); - --color-error-content: oklch(27% 0.105 12.094); - --radius-selector: 0.5rem; - --radius-field: 0.25rem; - --radius-box: 0.5rem; - --size-selector: 0.25rem; - --size-field: 0.25rem; - --border: 1px; - --depth: 1; - --noise: 0; - } - } -} -@layer base { - :root:has(input.theme-controller[value=light]:checked),[data-theme=light] { - color-scheme: light; - --color-base-100: oklch(100% 0 0); - --color-base-200: oklch(98% 0 0); - --color-base-300: oklch(95% 0 0); - --color-base-content: oklch(21% 0.006 285.885); - --color-primary: oklch(45% 0.24 277.023); - --color-primary-content: oklch(93% 0.034 272.788); - --color-secondary: oklch(65% 0.241 354.308); - --color-secondary-content: oklch(94% 0.028 342.258); - --color-accent: oklch(77% 0.152 181.912); - --color-accent-content: oklch(38% 0.063 188.416); - --color-neutral: oklch(14% 0.005 285.823); - --color-neutral-content: oklch(92% 0.004 286.32); - --color-info: oklch(74% 0.16 232.661); - --color-info-content: oklch(29% 0.066 243.157); - --color-success: oklch(76% 0.177 163.223); - --color-success-content: oklch(37% 0.077 168.94); - --color-warning: oklch(82% 0.189 84.429); - --color-warning-content: oklch(41% 0.112 45.904); - --color-error: oklch(71% 0.194 13.428); - --color-error-content: oklch(27% 0.105 12.094); - --radius-selector: 0.5rem; - --radius-field: 0.25rem; - --radius-box: 0.5rem; - --size-selector: 0.25rem; - --size-field: 0.25rem; - --border: 1px; - --depth: 1; - --noise: 0; - } -} -@layer base { - :root:has(input.theme-controller[value=dark]:checked),[data-theme=dark] { - color-scheme: dark; - --color-base-100: oklch(25.33% 0.016 252.42); - --color-base-200: oklch(23.26% 0.014 253.1); - --color-base-300: oklch(21.15% 0.012 254.09); - --color-base-content: oklch(97.807% 0.029 256.847); - --color-primary: oklch(58% 0.233 277.117); - --color-primary-content: oklch(96% 0.018 272.314); - --color-secondary: oklch(65% 0.241 354.308); - --color-secondary-content: oklch(94% 0.028 342.258); - --color-accent: oklch(77% 0.152 181.912); - --color-accent-content: oklch(38% 0.063 188.416); - --color-neutral: oklch(14% 0.005 285.823); - --color-neutral-content: oklch(92% 0.004 286.32); - --color-info: oklch(74% 0.16 232.661); - --color-info-content: oklch(29% 0.066 243.157); - --color-success: oklch(76% 0.177 163.223); - --color-success-content: oklch(37% 0.077 168.94); - --color-warning: oklch(82% 0.189 84.429); - --color-warning-content: oklch(41% 0.112 45.904); - --color-error: oklch(71% 0.194 13.428); - --color-error-content: oklch(27% 0.105 12.094); - --radius-selector: 0.5rem; - --radius-field: 0.25rem; - --radius-box: 0.5rem; - --size-selector: 0.25rem; - --size-field: 0.25rem; - --border: 1px; - --depth: 1; - --noise: 0; - } -} -@layer base { - :root { - --fx-noise: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 200 200'%3E%3Cfilter id='a'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='1.34' numOctaves='4' stitchTiles='stitch'%3E%3C/feTurbulence%3E%3C/filter%3E%3Crect width='200' height='200' filter='url(%23a)' opacity='0.2'%3E%3C/rect%3E%3C/svg%3E"); - } -} -@layer base { - :root { - scrollbar-color: currentColor #0000; - @supports (color: color-mix(in lab, red, red)) { - scrollbar-color: color-mix(in oklch, currentColor 35%, #0000) #0000; - } - } -} -@layer base { - @property --radialprogress { - syntax: ""; - inherits: true; - initial-value: 0%; - } -} -@layer base { - :root:not(span) { - overflow: var(--page-overflow); - } -} -@layer base { - :root { - background: var(--page-scroll-bg, var(--root-bg)); - --page-scroll-bg-on: linear-gradient(var(--root-bg, #0000), var(--root-bg, #0000)) - var(--root-bg, #0000); - @supports (color: color-mix(in lab, red, red)) { - --page-scroll-bg-on: linear-gradient(var(--root-bg, #0000), var(--root-bg, #0000)) - color-mix(in srgb, var(--root-bg, #0000), oklch(0% 0 0) calc(var(--page-has-backdrop, 0) * 40%)); - } - --page-scroll-transition-on: background-color 0.3s ease-out; - transition: var(--page-scroll-transition); - scrollbar-gutter: var(--page-scroll-gutter, unset); - scrollbar-gutter: if(style(--page-has-scroll: 1): var(--page-scroll-gutter, unset) ; else: unset); - } - @keyframes set-page-has-scroll { - 0%, to { - --page-has-scroll: 1; - } - } -} -@layer base { - :root, [data-theme] { - background: var(--page-scroll-bg, var(--root-bg)); - color: var(--color-base-content); - } - :where(:root, [data-theme]) { - --root-bg: var(--color-base-100); - } -} -@keyframes rating { - 0%, 40% { - scale: 1.1; - filter: brightness(1.05) contrast(1.05); - } -} -@keyframes dropdown { - 0% { - opacity: 0; - } -} -@keyframes radio { - 0% { - padding: 5px; - } - 50% { - padding: 3px; - } -} -@keyframes toast { - 0% { - scale: 0.9; - opacity: 0; - } - 100% { - scale: 1; - opacity: 1; - } -} -@keyframes rotator { - 89.9999%, 100% { - --first-item-position: 0 0%; - } - 90%, 99.9999% { - --first-item-position: 0 calc(var(--items) * 100%); - } - 100% { - translate: 0 -100%; - } -} -@keyframes skeleton { - 0% { - background-position: 150%; - } - 100% { - background-position: -50%; - } -} -@keyframes menu { - 0% { - opacity: 0; - } -} -@keyframes progress { - 50% { - background-position-x: -115%; - } -} -@property --tw-space-y-reverse { - syntax: "*"; - inherits: false; - initial-value: 0; -} -@property --tw-space-x-reverse { - syntax: "*"; - inherits: false; - initial-value: 0; -} -@property --tw-border-style { - syntax: "*"; - inherits: false; - initial-value: solid; -} -@property --tw-font-weight { - syntax: "*"; - inherits: false; -} -@property --tw-shadow { - syntax: "*"; - inherits: false; - initial-value: 0 0 #0000; -} -@property --tw-shadow-color { - syntax: "*"; - inherits: false; -} -@property --tw-shadow-alpha { - syntax: ""; - inherits: false; - initial-value: 100%; -} -@property --tw-inset-shadow { - syntax: "*"; - inherits: false; - initial-value: 0 0 #0000; -} -@property --tw-inset-shadow-color { - syntax: "*"; - inherits: false; -} -@property --tw-inset-shadow-alpha { - syntax: ""; - inherits: false; - initial-value: 100%; -} -@property --tw-ring-color { - syntax: "*"; - inherits: false; -} -@property --tw-ring-shadow { - syntax: "*"; - inherits: false; - initial-value: 0 0 #0000; -} -@property --tw-inset-ring-color { - syntax: "*"; - inherits: false; -} -@property --tw-inset-ring-shadow { - syntax: "*"; - inherits: false; - initial-value: 0 0 #0000; -} -@property --tw-ring-inset { - syntax: "*"; - inherits: false; -} -@property --tw-ring-offset-width { - syntax: ""; - inherits: false; - initial-value: 0px; -} -@property --tw-ring-offset-color { - syntax: "*"; - inherits: false; - initial-value: #fff; -} -@property --tw-ring-offset-shadow { - syntax: "*"; - inherits: false; - initial-value: 0 0 #0000; -} -@property --tw-blur { - syntax: "*"; - inherits: false; -} -@property --tw-brightness { - syntax: "*"; - inherits: false; -} -@property --tw-contrast { - syntax: "*"; - inherits: false; -} -@property --tw-grayscale { - syntax: "*"; - inherits: false; -} -@property --tw-hue-rotate { - syntax: "*"; - inherits: false; -} -@property --tw-invert { - syntax: "*"; - inherits: false; -} -@property --tw-opacity { - syntax: "*"; - inherits: false; -} -@property --tw-saturate { - syntax: "*"; - inherits: false; -} -@property --tw-sepia { - syntax: "*"; - inherits: false; -} -@property --tw-drop-shadow { - syntax: "*"; - inherits: false; -} -@property --tw-drop-shadow-color { - syntax: "*"; - inherits: false; -} -@property --tw-drop-shadow-alpha { - syntax: ""; - inherits: false; - initial-value: 100%; -} -@property --tw-drop-shadow-size { - syntax: "*"; - inherits: false; -} -@layer properties { - @supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))) { - *, ::before, ::after, ::backdrop { - --tw-space-y-reverse: 0; - --tw-space-x-reverse: 0; - --tw-border-style: solid; - --tw-font-weight: initial; - --tw-shadow: 0 0 #0000; - --tw-shadow-color: initial; - --tw-shadow-alpha: 100%; - --tw-inset-shadow: 0 0 #0000; - --tw-inset-shadow-color: initial; - --tw-inset-shadow-alpha: 100%; - --tw-ring-color: initial; - --tw-ring-shadow: 0 0 #0000; - --tw-inset-ring-color: initial; - --tw-inset-ring-shadow: 0 0 #0000; - --tw-ring-inset: initial; - --tw-ring-offset-width: 0px; - --tw-ring-offset-color: #fff; - --tw-ring-offset-shadow: 0 0 #0000; - --tw-blur: initial; - --tw-brightness: initial; - --tw-contrast: initial; - --tw-grayscale: initial; - --tw-hue-rotate: initial; - --tw-invert: initial; - --tw-opacity: initial; - --tw-saturate: initial; - --tw-sepia: initial; - --tw-drop-shadow: initial; - --tw-drop-shadow-color: initial; - --tw-drop-shadow-alpha: 100%; - --tw-drop-shadow-size: initial; - } - } -}