starting-point-ui 0.1.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.css CHANGED
@@ -1 +1 @@
1
- @layer components{.btn{@apply inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*="size-"])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive;@apply [&:where(&:not(.btn-default,.btn-destructive,.btn-outline,.btn-secondary,.btn-ghost,.btn-link))]:btn-default;@apply [&:where(&:not(.btn-base,.btn-sm,.btn-lg,.btn-icon,.btn-icon-sm,.btn-icon-lg))]:btn-base;}}@utility btn-default{@apply bg-primary text-primary-foreground hover:bg-primary/90;}@utility btn-destructive{@apply bg-destructive text-white hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60;}@utility btn-outline{@apply border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50;}@utility btn-secondary{@apply bg-secondary text-secondary-foreground hover:bg-secondary/80;}@utility btn-ghost{@apply hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50;}@utility btn-link{@apply text-primary underline-offset-4 hover:underline;}@utility btn-sm{@apply h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5;}@utility btn-base{@apply h-9 px-4 py-2 has-[>svg]:px-3;}@utility btn-lg{@apply h-10 rounded-md px-6 has-[>svg]:px-4;}@utility btn-icon-sm{@apply size-8;}@utility btn-icon{@apply size-9;}@utility btn-icon-lg{@apply size-10;}@layer components{.card{@apply text-card-foreground rounded-xl;@apply [&:where(&:not(.card-default,.card-outline,.card-muted))]:card-default;}.card-content{@apply [&:where(&:not(.card-content-sm,.card-content-base,.card-content-lg))]:card-content-base;}}@utility card-default{@apply bg-card border shadow-sm;}@utility card-outline{@apply bg-card border;}@utility card-muted{@apply bg-muted;}@utility card-content-sm{@apply p-4;}@utility card-content-base{@apply p-6;}@utility card-content-lg{@apply p-12;}@layer components{.checkbox{@apply border-input size-4 shrink-0 rounded-[4px] border shadow-xs transition-[box-shadow,background-color,border-color] outline-none appearance-none cursor-pointer;@apply dark:bg-input/30;@apply checked:bg-primary checked:border-primary;@apply disabled:cursor-not-allowed disabled:opacity-50;@apply focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px];@apply aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive;}.checkbox:checked{background-image:url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M12.207 4.793a1 1 0 010 1.414l-5 5a1 1 0 01-1.414 0l-2-2a1 1 0 011.414-1.414L6.5 9.086l4.293-4.293a1 1 0 011.414 0z'/%3e%3c/svg%3e");background-size:100% 100%;background-position:center;background-repeat:no-repeat}.dark .checkbox:checked{background-image:url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='black' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M12.207 4.793a1 1 0 010 1.414l-5 5a1 1 0 01-1.414 0l-2-2a1 1 0 011.414-1.414L6.5 9.086l4.293-4.293a1 1 0 011.414 0z'/%3e%3c/svg%3e")}}@utility container{@apply px-6 w-full max-w-3xl lg:max-w-7xl mx-auto;}@utility container-wide{@apply px-6 w-full max-w-7xl mx-auto;}@utility container-fluid{@apply px-6 w-full;}@layer components{.dialog{@apply isolate pointer-events-none fixed inset-0 z-999 w-full h-dvh p-0 bg-transparent border-none max-w-none max-h-none overflow-hidden;}.dialog::backdrop{@apply hidden;}.dialog-backdrop{@apply fixed inset-0 bg-black/50 -z-1 pointer-events-auto [animation-fill-mode:forwards]!;}.dialog-panel{@apply fixed pointer-events-auto top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 bg-background rounded-lg shadow-lg p-6 max-w-md w-[calc(100%-2rem)] max-h-[calc(100%-2rem)] overflow-y-auto [animation-fill-mode:forwards]!;}}@layer components{.input{@apply border-input w-full min-w-0 rounded-md border bg-transparent px-3 text-sm shadow-xs transition-[color,box-shadow] outline-none;@apply placeholder:text-muted-foreground;@apply dark:bg-input/30;@apply file:text-foreground file:inline-flex file:border-0 file:bg-transparent file:text-sm file:font-medium;@apply selection:bg-primary selection:text-primary-foreground;@apply disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50;@apply focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px];@apply aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive;@apply [&:where(&:not(.input-sm,.input-base,.input-lg))]:input-base;}}@utility input-sm{@apply h-8 file:h-8;}@utility input-base{@apply h-9 file:h-9;}@utility input-lg{@apply h-10 file:h-10;}@layer components{.label{@apply flex items-center gap-2 text-sm leading-none font-medium select-none;@apply group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50;@apply peer-disabled:cursor-not-allowed peer-disabled:opacity-50;}}@layer components{.select{@apply border-input w-full min-w-0 appearance-none rounded-md border bg-transparent text-sm shadow-xs transition-[color,box-shadow] outline-none;@apply placeholder:text-muted-foreground;@apply selection:bg-primary selection:text-primary-foreground;@apply dark:bg-input/30 dark:hover:bg-input/50;@apply disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50;@apply focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px];@apply aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive;@apply [&:where(&:not(.select-sm,.select-base,.select-lg))]:select-base;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='%2371717a' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3e%3cpath d='m6 9 6 6 6-6'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right .75rem center;background-size:1rem}}@utility select-sm{@apply h-8 px-3 pr-9;}@utility select-base{@apply h-9 px-3 pr-9;}@utility select-lg{@apply h-10 px-3 pr-9;}@layer components{.table{@apply w-max min-w-full caption-bottom text-sm;}.table-header{@apply [&_tr]:border-b;}.table-body{@apply [&_tr:last-child]:border-0;}.table-footer{@apply bg-muted/50 border-t font-medium [&>tr]:last:border-b-0;}.table-row{@apply border-b transition-colors hover:bg-muted/50;}.table-head{@apply px-4 py-3 text-left align-middle font-medium text-foreground whitespace-nowrap;}.table-cell{@apply px-4 py-3 align-middle whitespace-nowrap;}}@layer components{.tab-list{@apply bg-muted text-muted-foreground inline-flex h-9 w-fit items-center justify-center rounded-lg p-[3px];}.tab{@apply text-foreground dark:text-muted-foreground inline-flex h-[calc(100%-1px)] flex-1 items-center justify-center gap-1.5 rounded-md border border-transparent px-2 py-1 text-sm font-medium whitespace-nowrap transition-[color,box-shadow] disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*="size-"])]:size-4;@apply outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] focus-visible:outline-1 focus-visible:outline-ring;}.tab.active{@apply bg-background shadow-sm dark:text-foreground dark:border-input dark:bg-input/30;}.tab-panel{@apply hidden w-full min-w-0 outline-none;}.tab-panel.active{@apply block;}}@layer components{.textarea{@apply border-input w-full rounded-md border bg-transparent shadow-xs transition-[color,box-shadow] outline-none;@apply placeholder:text-muted-foreground;@apply dark:bg-input/30;@apply field-sizing-content min-h-16 px-3 py-2 text-sm;@apply disabled:cursor-not-allowed disabled:opacity-50;@apply focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px];@apply aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive;}}@custom-variant dark (&:is(.dark *));:root{--radius: .625rem;--background: oklch(1 0 0);--foreground: oklch(.145 0 0);--card: oklch(1 0 0);--card-foreground: oklch(.145 0 0);--popover: oklch(1 0 0);--popover-foreground: oklch(.145 0 0);--primary: oklch(.205 0 0);--primary-foreground: oklch(.985 0 0);--secondary: oklch(.97 0 0);--secondary-foreground: oklch(.205 0 0);--muted: oklch(.97 0 0);--muted-foreground: oklch(.556 0 0);--accent: oklch(.97 0 0);--accent-foreground: oklch(.205 0 0);--destructive: oklch(.577 .245 27.325);--border: oklch(.922 0 0);--input: oklch(.922 0 0);--ring: oklch(.708 0 0)}.dark{--background: oklch(.145 0 0);--foreground: oklch(.985 0 0);--card: oklch(.205 0 0);--card-foreground: oklch(.985 0 0);--popover: oklch(.205 0 0);--popover-foreground: oklch(.985 0 0);--primary: oklch(.922 0 0);--primary-foreground: oklch(.205 0 0);--secondary: oklch(.269 0 0);--secondary-foreground: oklch(.985 0 0);--muted: oklch(.269 0 0);--muted-foreground: oklch(.708 0 0);--accent: oklch(.269 0 0);--accent-foreground: oklch(.985 0 0);--destructive: oklch(.704 .191 22.216);--border: oklch(1 0 0 / 10%);--input: oklch(1 0 0 / 15%);--ring: oklch(.556 0 0)}@theme inline{ --color-background: var(--background); --color-foreground: var(--foreground); --color-card: var(--card); --color-card-foreground: var(--card-foreground); --color-popover: var(--popover); --color-popover-foreground: var(--popover-foreground); --color-primary: var(--primary); --color-primary-foreground: var(--primary-foreground); --color-secondary: var(--secondary); --color-secondary-foreground: var(--secondary-foreground); --color-muted: var(--muted); --color-muted-foreground: var(--muted-foreground); --color-accent: var(--accent); --color-accent-foreground: var(--accent-foreground); --color-destructive: var(--destructive); --color-destructive-foreground: var(--destructive-foreground); --color-border: var(--border); --color-input: var(--input); --color-ring: var(--ring); --radius-sm: calc(var(--radius) - 4px); --radius-md: calc(var(--radius) - 2px); --radius-lg: var(--radius); --radius-xl: calc(var(--radius) + 4px); }@layer base{*{@apply border-border outline-ring/50;}html{scrollbar-gutter:stable}html:has(dialog[open] .dialog-backdrop){@apply overflow-hidden;}body,.dark{@apply bg-background text-foreground;}}
1
+ @layer components{.avatar{@apply aspect-square shrink-0 rounded-full object-cover;@apply [&:where(&:not(.avatar-sm,.avatar-base,.avatar-lg))]:avatar-base;}.avatar-fallback{@apply inline-flex items-center justify-center rounded-full bg-muted text-muted-foreground font-medium;@apply [&:where(&:not(.avatar-sm,.avatar-base,.avatar-lg))]:avatar-base;}}@utility avatar-sm{@apply size-8 text-xs;}@utility avatar-base{@apply size-9 text-sm;}@utility avatar-lg{@apply size-10 text-base;}@layer components{.avatar-group{@apply flex -space-x-2;}.avatar-group .avatar,.avatar-group .avatar-fallback{@apply ring-2 ring-background;}}@layer components{.badge{@apply inline-flex items-center justify-center gap-1 rounded-full border px-2 py-0.5 text-xs font-medium w-fit whitespace-nowrap shrink-0 overflow-hidden transition-[color,box-shadow] [&_svg]:pointer-events-none [&_svg:not([class*="size-"])]:size-3 [&_svg]:shrink-0;@apply outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px];@apply [&:where(&:not(.badge-default,.badge-secondary,.badge-destructive,.badge-outline))]:badge-default;}}@utility badge-default{@apply border-transparent bg-primary text-primary-foreground [&:is(a)]:hover:bg-primary/90;}@utility badge-secondary{@apply border-transparent bg-secondary text-secondary-foreground [&:is(a)]:hover:bg-secondary/90;}@utility badge-destructive{@apply border-transparent bg-destructive text-white dark:bg-destructive/60 [&:is(a)]:hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40;}@utility badge-outline{@apply text-foreground [&:is(a)]:hover:bg-accent [&:is(a)]:hover:text-accent-foreground;}@layer components{.btn{@apply inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*="size-"])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive;@apply [&:where(&:not(.btn-default,.btn-destructive,.btn-outline,.btn-secondary,.btn-ghost,.btn-link))]:btn-default;@apply [&:where(&:not(.btn-base,.btn-sm,.btn-lg,.btn-icon,.btn-icon-sm,.btn-icon-lg))]:btn-base;}}@utility btn-default{@apply bg-primary text-primary-foreground hover:bg-primary/90;}@utility btn-destructive{@apply bg-destructive text-white hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60;}@utility btn-outline{@apply border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50;}@utility btn-secondary{@apply bg-secondary text-secondary-foreground hover:bg-secondary/80;}@utility btn-ghost{@apply hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50;}@utility btn-link{@apply text-primary underline-offset-4 hover:underline;}@utility btn-sm{@apply h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5;}@utility btn-base{@apply h-9 px-4 py-2 has-[>svg]:px-3;}@utility btn-lg{@apply h-10 rounded-md px-6 has-[>svg]:px-4;}@utility btn-icon-sm{@apply size-8;}@utility btn-icon{@apply size-9;}@utility btn-icon-lg{@apply size-10;}@layer components{.card{@apply text-card-foreground rounded-xl;@apply [&:where(&:not(.card-default,.card-outline,.card-muted))]:card-default;}.card-content{@apply [&:where(&:not(.card-content-sm,.card-content-base,.card-content-lg))]:card-content-base;}}@utility card-default{@apply bg-card border shadow-sm;}@utility card-outline{@apply bg-card border;}@utility card-muted{@apply bg-muted;}@utility card-content-sm{@apply p-4;}@utility card-content-base{@apply p-6;}@utility card-content-lg{@apply p-12;}@layer components{.checkbox{@apply border-input size-4 shrink-0 rounded-[4px] border shadow-xs transition-[box-shadow,background-color,border-color] outline-none appearance-none cursor-pointer;@apply dark:bg-input/30;@apply checked:bg-primary checked:border-primary;@apply disabled:cursor-not-allowed disabled:opacity-50;@apply focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px];@apply aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive;}.checkbox:checked{background-image:url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M12.207 4.793a1 1 0 010 1.414l-5 5a1 1 0 01-1.414 0l-2-2a1 1 0 011.414-1.414L6.5 9.086l4.293-4.293a1 1 0 011.414 0z'/%3e%3c/svg%3e");background-size:100% 100%;background-position:center;background-repeat:no-repeat}.dark .checkbox:checked{background-image:url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='black' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M12.207 4.793a1 1 0 010 1.414l-5 5a1 1 0 01-1.414 0l-2-2a1 1 0 011.414-1.414L6.5 9.086l4.293-4.293a1 1 0 011.414 0z'/%3e%3c/svg%3e")}}@utility container{@apply px-6 w-full max-w-3xl lg:max-w-7xl mx-auto;}@utility container-wide{@apply px-6 w-full max-w-7xl mx-auto;}@utility container-fluid{@apply px-6 w-full;}@layer components{.dialog{@apply isolate pointer-events-none fixed inset-0 z-999 w-full h-dvh p-0 bg-transparent border-none max-w-none max-h-none overflow-hidden;}.dialog::backdrop{@apply hidden;}.dialog-backdrop{@apply fixed inset-0 bg-black/50 -z-1 pointer-events-auto [animation-fill-mode:forwards]!;}.dialog-panel{@apply fixed pointer-events-auto top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 bg-background rounded-lg shadow-lg p-6 max-w-md w-[calc(100%-2rem)] max-h-[calc(100%-2rem)] overflow-y-auto [animation-fill-mode:forwards]!;}}@layer components{.dropdown{@apply relative inline-block;}.dropdown-menu{@apply absolute z-998 hidden min-w-40 overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md whitespace-nowrap;}.dropdown-menu.open{@apply block;}.dropdown-item{@apply relative flex cursor-default select-none items-center gap-2.5 rounded-sm px-2.5 py-1.5 text-sm outline-none transition-colors;@apply hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:text-accent-foreground;@apply [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*="size-"])]:size-4;}.dropdown-item[aria-disabled=true]{@apply pointer-events-none opacity-50;}.dropdown-label{@apply px-2.5 py-1.5 text-sm font-medium;}.dropdown-separator{@apply -mx-1 my-1 h-px bg-border;}}@layer components{.input{@apply border-input w-full min-w-0 rounded-md border bg-transparent px-3 text-sm shadow-xs transition-[color,box-shadow] outline-none;@apply placeholder:text-muted-foreground;@apply dark:bg-input/30;@apply file:text-foreground file:inline-flex file:border-0 file:bg-transparent file:text-sm file:font-medium;@apply selection:bg-primary selection:text-primary-foreground;@apply disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50;@apply focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px];@apply aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive;@apply [&:where(&:not(.input-sm,.input-base,.input-lg))]:input-base;}}@utility input-sm{@apply h-8 file:h-8;}@utility input-base{@apply h-9 file:h-9;}@utility input-lg{@apply h-10 file:h-10;}@layer components{.label{@apply flex items-center gap-2 text-sm leading-none font-medium select-none;@apply group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50;@apply peer-disabled:cursor-not-allowed peer-disabled:opacity-50;}}@layer components{.select{@apply border-input w-full min-w-0 appearance-none rounded-md border bg-transparent text-sm shadow-xs transition-[color,box-shadow] outline-none;@apply placeholder:text-muted-foreground;@apply selection:bg-primary selection:text-primary-foreground;@apply dark:bg-input/30 dark:hover:bg-input/50;@apply disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50;@apply focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px];@apply aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive;@apply [&:where(&:not(.select-sm,.select-base,.select-lg))]:select-base;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='%2371717a' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3e%3cpath d='m6 9 6 6 6-6'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right .75rem center;background-size:1rem}}@utility select-sm{@apply h-8 px-3 pr-9;}@utility select-base{@apply h-9 px-3 pr-9;}@utility select-lg{@apply h-10 px-3 pr-9;}@layer components{.sheet-backdrop{@apply fixed inset-0 bg-black/50 -z-1 pointer-events-auto [animation-fill-mode:forwards]!;}.sheet-panel{@apply fixed pointer-events-auto bg-background shadow-lg p-6 [animation-fill-mode:forwards]!;@apply [&:where(&:not(.sheet-left,.sheet-right,.sheet-top,.sheet-bottom))]:sheet-left;}}@utility sheet-left{@apply top-0 bottom-0 left-0 h-full w-3/4 max-w-sm border-r;}@utility sheet-right{@apply top-0 bottom-0 right-0 h-full w-3/4 max-w-sm border-l;}@utility sheet-top{@apply top-0 left-0 right-0 w-full border-b;}@utility sheet-bottom{@apply bottom-0 left-0 right-0 w-full border-t;}@layer components{.table{@apply w-max min-w-full caption-bottom text-sm;}.table-header{@apply [&_tr]:border-b;}.table-body{@apply [&_tr:last-child]:border-0;}.table-footer{@apply bg-muted/50 border-t font-medium [&>tr]:last:border-b-0;}.table-row{@apply border-b transition-colors hover:bg-muted/50;}.table-head{@apply px-4 py-3 text-left align-middle font-medium text-foreground whitespace-nowrap;}.table-cell{@apply px-4 py-3 align-middle whitespace-nowrap;}}@layer components{.tab-list{@apply bg-muted text-muted-foreground inline-flex h-9 w-fit items-center justify-center rounded-lg p-[3px];}.tab{@apply text-foreground dark:text-muted-foreground inline-flex h-[calc(100%-1px)] flex-1 items-center justify-center gap-1.5 rounded-md border border-transparent px-2 py-1 text-sm font-medium whitespace-nowrap transition-[color,box-shadow] disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*="size-"])]:size-4;@apply outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] focus-visible:outline-1 focus-visible:outline-ring;}.tab.active{@apply bg-background shadow-sm dark:text-foreground dark:border-input dark:bg-input/30;}.tab-panel{@apply hidden w-full min-w-0 outline-none;}.tab-panel.active{@apply block;}}@layer components{.textarea{@apply border-input w-full rounded-md border bg-transparent shadow-xs transition-[color,box-shadow] outline-none;@apply placeholder:text-muted-foreground;@apply dark:bg-input/30;@apply field-sizing-content min-h-16 px-3 py-2 text-sm;@apply disabled:cursor-not-allowed disabled:opacity-50;@apply focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px];@apply aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive;}}@custom-variant dark (&:is(.dark *));:root{--radius: .625rem;--background: oklch(1 0 0);--foreground: oklch(.145 0 0);--card: oklch(1 0 0);--card-foreground: oklch(.145 0 0);--popover: oklch(1 0 0);--popover-foreground: oklch(.145 0 0);--primary: oklch(.205 0 0);--primary-foreground: oklch(.985 0 0);--secondary: oklch(.97 0 0);--secondary-foreground: oklch(.205 0 0);--muted: oklch(.97 0 0);--muted-foreground: oklch(.556 0 0);--accent: oklch(.97 0 0);--accent-foreground: oklch(.205 0 0);--destructive: oklch(.577 .245 27.325);--border: oklch(.922 0 0);--input: oklch(.922 0 0);--ring: oklch(.708 0 0)}.dark{--background: oklch(.145 0 0);--foreground: oklch(.985 0 0);--card: oklch(.205 0 0);--card-foreground: oklch(.985 0 0);--popover: oklch(.205 0 0);--popover-foreground: oklch(.985 0 0);--primary: oklch(.922 0 0);--primary-foreground: oklch(.205 0 0);--secondary: oklch(.269 0 0);--secondary-foreground: oklch(.985 0 0);--muted: oklch(.269 0 0);--muted-foreground: oklch(.708 0 0);--accent: oklch(.269 0 0);--accent-foreground: oklch(.985 0 0);--destructive: oklch(.704 .191 22.216);--border: oklch(1 0 0 / 10%);--input: oklch(1 0 0 / 15%);--ring: oklch(.556 0 0)}@theme inline{ --color-background: var(--background); --color-foreground: var(--foreground); --color-card: var(--card); --color-card-foreground: var(--card-foreground); --color-popover: var(--popover); --color-popover-foreground: var(--popover-foreground); --color-primary: var(--primary); --color-primary-foreground: var(--primary-foreground); --color-secondary: var(--secondary); --color-secondary-foreground: var(--secondary-foreground); --color-muted: var(--muted); --color-muted-foreground: var(--muted-foreground); --color-accent: var(--accent); --color-accent-foreground: var(--accent-foreground); --color-destructive: var(--destructive); --color-destructive-foreground: var(--destructive-foreground); --color-border: var(--border); --color-input: var(--input); --color-ring: var(--ring); --radius-sm: calc(var(--radius) - 4px); --radius-md: calc(var(--radius) - 2px); --radius-lg: var(--radius); --radius-xl: calc(var(--radius) + 4px); }@layer base{*{@apply border-border outline-ring/50;}html{scrollbar-gutter:stable}html:has(dialog[open] :is(.dialog-backdrop,.sheet-backdrop)){@apply overflow-hidden;}body,.dark{@apply bg-background text-foreground;}}
package/dist/index.d.ts CHANGED
@@ -1,12 +1,20 @@
1
- declare function open(dialog: HTMLDialogElement): void;
2
- declare function close(dialog: HTMLDialogElement): Promise<void>;
3
- declare function toggle(dialog: HTMLDialogElement): void;
1
+ declare function open$1(dialog: HTMLDialogElement): void;
2
+ declare function close$1(dialog: HTMLDialogElement): Promise<void>;
3
+ declare function toggle$1(dialog: HTMLDialogElement): void;
4
4
 
5
- declare const dialog_close: typeof close;
6
- declare const dialog_open: typeof open;
7
- declare const dialog_toggle: typeof toggle;
8
5
  declare namespace dialog {
9
- export { dialog_close as close, dialog_open as open, dialog_toggle as toggle };
6
+ export { close$1 as close, open$1 as open, toggle$1 as toggle };
7
+ }
8
+
9
+ declare function open(dropdown: HTMLElement): void;
10
+ declare function close(dropdown: HTMLElement): Promise<void>;
11
+ declare function toggle(dropdown: HTMLElement): void;
12
+
13
+ declare const dropdown_close: typeof close;
14
+ declare const dropdown_open: typeof open;
15
+ declare const dropdown_toggle: typeof toggle;
16
+ declare namespace dropdown {
17
+ export { dropdown_close as close, dropdown_open as open, dropdown_toggle as toggle };
10
18
  }
11
19
 
12
20
  declare function select(tab: HTMLElement): void;
@@ -20,9 +28,10 @@ declare global {
20
28
  interface Window {
21
29
  sp: {
22
30
  dialog: typeof dialog;
31
+ dropdown: typeof dropdown;
23
32
  tabs: typeof tabs;
24
33
  };
25
34
  }
26
35
  }
27
36
 
28
- export { dialog, tabs };
37
+ export { dialog, dropdown, tabs };
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- var M=Object.defineProperty;var b=(e,t)=>{for(var n in t)M(e,n,{get:t[n],enumerable:true});};var u={};b(u,{close:()=>a,open:()=>d,toggle:()=>v});var H=["a[href]","button:not([disabled])","input:not([disabled])","select:not([disabled])","textarea:not([disabled])","[tabindex]:not([tabindex='-1'])","[contenteditable]:not([contenteditable='false'])","audio[controls]","video[controls]","details > summary","iframe"].join(", ");function c(e){return [...e.querySelectorAll(H)].filter(t=>t.offsetParent!==null)}function g(e){return [...e.querySelectorAll(".dialog-backdrop, .dialog-panel")]}function r(e,t){for(let n of e)t===null?n.removeAttribute("data-state"):n.setAttribute("data-state",t);}async function y(e){let t=e.flatMap(n=>n.getAnimations());t.length!==0&&await Promise.all(t.map(n=>n.finished));}function p(e){return e.querySelector(".dialog-backdrop")!==null}function d(e){e.show();let t=g(e);if(r(t,"open"),p(e)){let n=c(e);n.length>0&&n[0].focus();}}async function a(e){let t=g(e);r(t,"closed"),await y(t),e.close(),r(t,null);}function v(e){e.open?a(e):d(e);}function h(e){let t=e.target.closest("dialog");if(t?.open){if(e.key==="Escape"){e.preventDefault(),t.dataset.spBackdrop==="static"||a(t);return}if(e.key==="Tab"&&p(t)){let n=c(t);if(n.length===0)return;let l=n[0],s=n[n.length-1];e.shiftKey&&document.activeElement===l?(e.preventDefault(),s.focus()):!e.shiftKey&&document.activeElement===s&&(e.preventDefault(),l.focus());}}}function A(e){let t=e.target,n=t.closest("[data-sp-toggle='dialog']");if(n){let o=n.dataset.spTarget;if(o){let i=document.querySelector(o);i&&d(i);}return}let l=t.closest("[data-sp-dismiss='dialog']");if(l){let o=l.closest("dialog");o&&a(o);return}let s=t.closest(".dialog-backdrop");if(s){let o=s.closest("dialog");o&&(o.dataset.spBackdrop==="static"||a(o));}}var E=false;(function(){typeof document>"u"||E||(E=true,document.addEventListener("click",A),document.addEventListener("keydown",h));})();var m={};b(m,{select:()=>f});function f(e){if(e.hasAttribute("disabled"))return;let t=e.closest(".tab-list");if(!t)return;let n=t.querySelectorAll(".tab");for(let s of n){s.classList.remove("active"),s.setAttribute("aria-selected","false"),s.setAttribute("tabindex","-1");let o=s.dataset.spTarget;o&&document.querySelector(o)?.classList.remove("active");}e.classList.add("active"),e.setAttribute("aria-selected","true"),e.setAttribute("tabindex","0");let l=e.dataset.spTarget;l&&document.querySelector(l)?.classList.add("active");}function k(e){let n=e.target.closest("[data-sp-toggle='tab']");n&&f(n);}function L(e,t,n){let l=e.length;for(let s=1;s<=l;s++){let o=(t+s*n+l)%l;if(!e[o].hasAttribute("disabled"))return e[o]}return null}function w(e){let t=e.target;if(!t.classList.contains("tab"))return;let n=t.closest(".tab-list");if(!n)return;let l=[...n.querySelectorAll(".tab")],s=l.indexOf(t),o=null;switch(e.key){case "ArrowLeft":o=L(l,s,-1);break;case "ArrowRight":o=L(l,s,1);break;case "Home":o=l.find(i=>!i.hasAttribute("disabled"))??null;break;case "End":o=[...l].reverse().find(i=>!i.hasAttribute("disabled"))??null;break}o&&(e.preventDefault(),o.focus(),f(o));}var T=false;(function(){typeof document>"u"||T||(T=true,document.addEventListener("click",k),document.addEventListener("keydown",w));})();typeof window<"u"&&(window.sp={dialog:u,tabs:m});export{u as dialog,m as tabs};//# sourceMappingURL=index.js.map
1
+ import {computePosition,offset,flip,shift}from'@floating-ui/dom';var O=Object.defineProperty;var p=(e,t)=>{for(var n in t)O(e,n,{get:t[n],enumerable:true});};var T={};p(T,{close:()=>c,open:()=>b,toggle:()=>C});var K=["a[href]","button:not([disabled])","input:not([disabled])","select:not([disabled])","textarea:not([disabled])","[tabindex]:not([tabindex='-1'])","[contenteditable]:not([contenteditable='false'])","audio[controls]","video[controls]","details > summary","iframe"].join(", ");function g(e){return [...e.querySelectorAll(K)].filter(t=>t.offsetParent!==null)}async function d(e){let t=e.flatMap(n=>n.getAnimations());t.length!==0&&await Promise.all(t.map(n=>n.finished));}var L=".dialog-backdrop, .sheet-backdrop",P=".dialog-panel, .sheet-panel";function h(e){return [...e.querySelectorAll(`${L}, ${P}`)]}function E(e,t){for(let n of e)t===null?n.removeAttribute("data-state"):n.setAttribute("data-state",t);}function A(e){return e.querySelector(L)!==null}function b(e){e.show();let t=h(e);if(E(t,"open"),A(e)){let n=g(e);n.length>0&&n[0].focus();}}async function c(e){let t=h(e);E(t,"closed"),await d(t),e.close(),E(t,null);}function C(e){e.open?c(e):b(e);}function F(e){let t=e.target.closest("dialog");if(t?.open){if(e.key==="Escape"){e.preventDefault(),t.dataset.spBackdrop==="static"||c(t);return}if(e.key==="Tab"&&A(t)){let n=g(t);if(n.length===0)return;let s=n[0],l=n[n.length-1];e.shiftKey&&document.activeElement===s?(e.preventDefault(),l.focus()):!e.shiftKey&&document.activeElement===l&&(e.preventDefault(),s.focus());}}}function B(e){let t=e.target,n=t.closest("[data-sp-toggle='dialog']");if(n){let o=n.dataset.spTarget;if(o){let a=document.querySelector(o);a&&b(a);}return}let s=t.closest("[data-sp-dismiss='dialog']");if(s){let o=s.closest("dialog");o&&c(o);return}let l=t.closest(L);if(l){let o=l.closest("dialog");o&&(o.dataset.spBackdrop==="static"||c(o));}}var v=false;(function(){typeof document>"u"||v||(v=true,document.addEventListener("click",B),document.addEventListener("keydown",F));})();var H={};p(H,{close:()=>r,open:()=>D,toggle:()=>M});function u(e){return e.querySelector(".dropdown-menu")}function f(e){return e.querySelector("[data-sp-toggle='dropdown']")}function m(){return document.querySelector(".dropdown-menu.open")?.closest(".dropdown")??null}async function _(e){let t=f(e),n=u(e);if(!t||!n)return;let s=e.dataset.spPlacement||"bottom-end",l=parseInt(e.dataset.spOffset||"4",10),{x:o,y:a}=await computePosition(t,n,{placement:s,middleware:[offset(l),flip(),shift({padding:8})]});Object.assign(n.style,{left:`${o}px`,top:`${a}px`});}function D(e){let t=u(e);if(!t||t.classList.contains("open"))return;let n=m();n&&r(n);let s=f(e);t.classList.add("open"),s?.setAttribute("aria-expanded","true"),t.setAttribute("data-state","open"),_(e);}async function r(e){let t=u(e);if(!t||!t.classList.contains("open"))return;f(e)?.setAttribute("aria-expanded","false"),t.setAttribute("data-state","closed"),await d([t]),t.classList.remove("open"),t.removeAttribute("data-state");}function M(e){u(e)?.classList.contains("open")?r(e):D(e);}function j(e){let t=e.target,n=t.closest("[data-sp-toggle='dropdown']");if(n){let o=n.closest(".dropdown");o&&(e.preventDefault(),M(o));return}let s=t.closest(".dropdown-item");if(s){if(s.getAttribute("aria-disabled")==="true"){e.preventDefault();return}let o=s.closest(".dropdown");o&&r(o);return}let l=m();l&&!l.contains(t)&&r(l);}function N(e){let t=e.target,n=t.closest(".dropdown"),s=m();if(e.key==="Escape"&&s){e.preventDefault();let q=f(s);r(s),q?.focus();return}if((e.key==="Enter"||e.key===" ")&&t.matches("[data-sp-toggle='dropdown']")){e.preventDefault(),n&&M(n);return}let l=n?u(n):null;if(!l?.classList.contains("open"))return;let o=[...l.querySelectorAll(".dropdown-item:not([aria-disabled='true'])")],a=o.indexOf(t),i=null;switch(e.key){case "ArrowDown":e.preventDefault(),a<0?i=o[0]:i=o[(a+1)%o.length];break;case "ArrowUp":e.preventDefault(),a<0?i=o[o.length-1]:i=o[(a-1+o.length)%o.length];break;case "Home":e.preventDefault(),i=o[0];break;case "End":e.preventDefault(),i=o[o.length-1];break}i&&i.focus();}function U(e){let t=m();if(!t)return;let n=e.relatedTarget;(!n||!t.contains(n))&&r(t);}var k=false;(function(){typeof document>"u"||k||(k=true,document.addEventListener("click",j),document.addEventListener("keydown",N),document.addEventListener("focusout",U));})();var w={};p(w,{select:()=>y});function y(e){if(e.hasAttribute("disabled"))return;let t=e.closest(".tab-list");if(!t)return;let n=t.querySelectorAll(".tab");for(let l of n){l.classList.remove("active"),l.setAttribute("aria-selected","false"),l.setAttribute("tabindex","-1");let o=l.dataset.spTarget;o&&document.querySelector(o)?.classList.remove("active");}e.classList.add("active"),e.setAttribute("aria-selected","true"),e.setAttribute("tabindex","0");let s=e.dataset.spTarget;s&&document.querySelector(s)?.classList.add("active");}function V(e){let n=e.target.closest("[data-sp-toggle='tab']");n&&y(n);}function x(e,t,n){let s=e.length;for(let l=1;l<=s;l++){let o=(t+l*n+s)%s;if(!e[o].hasAttribute("disabled"))return e[o]}return null}function W(e){let t=e.target;if(!t.classList.contains("tab"))return;let n=t.closest(".tab-list");if(!n)return;let s=[...n.querySelectorAll(".tab")],l=s.indexOf(t),o=null;switch(e.key){case "ArrowLeft":o=x(s,l,-1);break;case "ArrowRight":o=x(s,l,1);break;case "Home":o=s.find(a=>!a.hasAttribute("disabled"))??null;break;case "End":o=[...s].reverse().find(a=>!a.hasAttribute("disabled"))??null;break}o&&(e.preventDefault(),o.focus(),y(o));}var S=false;(function(){typeof document>"u"||S||(S=true,document.addEventListener("click",V),document.addEventListener("keydown",W));})();typeof window<"u"&&(window.sp={dialog:T,dropdown:H,tabs:w});export{T as dialog,H as dropdown,w as tabs};//# sourceMappingURL=index.js.map
2
2
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/js/dialog.ts","../src/js/utils.ts","../src/js/tabs.ts","../src/js/index.ts"],"names":["dialog_exports","__export","close","open","toggle","FOCUSABLE_SELECTOR","getFocusableElements","container","el","getAnimatableElements","dialog","setDataState","elements","state","waitForAnimations","animations","a","isModal","focusable","handleKeydown","dialogEl","first","last","handleClick","target","toggleBtn","selector","dismissBtn","backdrop","initialized","tabs_exports","select","tab","tabList","tabs","t","findNextEnabledTab","startIndex","direction","len","i","index","currentIndex","nextTab"],"mappings":"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","file":"index.js","sourcesContent":["// Starting Point UI Dialog Module\n\nimport { getFocusableElements } from \"./utils\";\n\nfunction getAnimatableElements(dialog: HTMLDialogElement): HTMLElement[] {\n return [\n ...dialog.querySelectorAll<HTMLElement>(\".dialog-backdrop, .dialog-panel\"),\n ];\n}\n\nfunction setDataState(\n elements: HTMLElement[],\n state: \"open\" | \"closed\" | null\n) {\n for (const el of elements) {\n if (state === null) {\n el.removeAttribute(\"data-state\");\n } else {\n el.setAttribute(\"data-state\", state);\n }\n }\n}\n\nasync function waitForAnimations(elements: HTMLElement[]): Promise<void> {\n const animations = elements.flatMap((el) => el.getAnimations());\n if (animations.length === 0) return;\n await Promise.all(animations.map((a) => a.finished));\n}\n\nfunction isModal(dialog: HTMLDialogElement): boolean {\n return dialog.querySelector(\".dialog-backdrop\") !== null;\n}\n\nexport function open(dialog: HTMLDialogElement) {\n dialog.show();\n const elements = getAnimatableElements(dialog);\n setDataState(elements, \"open\");\n\n // Focus first focusable element in modal dialogs\n if (isModal(dialog)) {\n const focusable = getFocusableElements(dialog);\n if (focusable.length > 0) {\n focusable[0].focus();\n }\n }\n}\n\nexport async function close(dialog: HTMLDialogElement) {\n const elements = getAnimatableElements(dialog);\n setDataState(elements, \"closed\");\n\n await waitForAnimations(elements);\n\n dialog.close();\n setDataState(elements, null);\n}\n\nexport function toggle(dialog: HTMLDialogElement) {\n if (dialog.open) {\n close(dialog);\n } else {\n open(dialog);\n }\n}\n\n// Handle keydown for Escape and focus trapping\nfunction handleKeydown(e: KeyboardEvent) {\n const dialogEl = (e.target as HTMLElement).closest<HTMLDialogElement>(\n \"dialog\"\n );\n if (!dialogEl?.open) return;\n\n // Handle Escape key\n if (e.key === \"Escape\") {\n e.preventDefault();\n const isStatic = dialogEl.dataset.spBackdrop === \"static\";\n if (!isStatic) {\n close(dialogEl);\n }\n return;\n }\n\n // Handle Tab key for focus trapping in modals\n if (e.key === \"Tab\" && isModal(dialogEl)) {\n const focusable = getFocusableElements(dialogEl);\n if (focusable.length === 0) return;\n\n const first = focusable[0];\n const last = focusable[focusable.length - 1];\n\n if (e.shiftKey && document.activeElement === first) {\n e.preventDefault();\n last.focus();\n } else if (!e.shiftKey && document.activeElement === last) {\n e.preventDefault();\n first.focus();\n }\n }\n}\n\n// Global click handler for data attributes\nfunction handleClick(e: MouseEvent) {\n const target = e.target as HTMLElement;\n\n // Handle toggle buttons\n const toggleBtn = target.closest<HTMLElement>(\"[data-sp-toggle='dialog']\");\n if (toggleBtn) {\n const selector = toggleBtn.dataset.spTarget;\n if (selector) {\n const dialogEl = document.querySelector<HTMLDialogElement>(selector);\n if (dialogEl) {\n open(dialogEl);\n }\n }\n return;\n }\n\n // Handle dismiss buttons\n const dismissBtn = target.closest<HTMLElement>(\"[data-sp-dismiss='dialog']\");\n if (dismissBtn) {\n const dialogEl = dismissBtn.closest<HTMLDialogElement>(\"dialog\");\n if (dialogEl) {\n close(dialogEl);\n }\n return;\n }\n\n // Handle backdrop clicks\n const backdrop = target.closest<HTMLElement>(\".dialog-backdrop\");\n if (backdrop) {\n const dialogEl = backdrop.closest<HTMLDialogElement>(\"dialog\");\n if (dialogEl) {\n // Static backdrop prevents closing via click\n const isStatic = dialogEl.dataset.spBackdrop === \"static\";\n if (!isStatic) {\n close(dialogEl);\n }\n }\n }\n}\n\n// Initialize global listeners\nlet initialized = false;\n\n(function init() {\n if (typeof document === \"undefined\" || initialized) return;\n initialized = true;\n\n document.addEventListener(\"click\", handleClick);\n document.addEventListener(\"keydown\", handleKeydown);\n})();\n","// Starting Point UI Utilities\n\nconst FOCUSABLE_SELECTOR = [\n \"a[href]\",\n \"button:not([disabled])\",\n \"input:not([disabled])\",\n \"select:not([disabled])\",\n \"textarea:not([disabled])\",\n \"[tabindex]:not([tabindex='-1'])\",\n \"[contenteditable]:not([contenteditable='false'])\",\n \"audio[controls]\",\n \"video[controls]\",\n \"details > summary\",\n \"iframe\",\n].join(\", \");\n\nexport function getFocusableElements(container: HTMLElement): HTMLElement[] {\n return [...container.querySelectorAll<HTMLElement>(FOCUSABLE_SELECTOR)].filter(\n (el) => el.offsetParent !== null\n );\n}\n","// Starting Point UI Tabs Module\n\nexport function select(tab: HTMLElement) {\n if (tab.hasAttribute(\"disabled\")) return;\n\n const tabList = tab.closest(\".tab-list\");\n if (!tabList) return;\n\n // Deselect all tabs in the list\n const tabs = tabList.querySelectorAll<HTMLElement>(\".tab\");\n for (const t of tabs) {\n t.classList.remove(\"active\");\n t.setAttribute(\"aria-selected\", \"false\");\n t.setAttribute(\"tabindex\", \"-1\");\n const selector = t.dataset.spTarget;\n if (selector) {\n document.querySelector(selector)?.classList.remove(\"active\");\n }\n }\n\n // Select the clicked tab\n tab.classList.add(\"active\");\n tab.setAttribute(\"aria-selected\", \"true\");\n tab.setAttribute(\"tabindex\", \"0\");\n\n const selector = tab.dataset.spTarget;\n if (selector) {\n document.querySelector(selector)?.classList.add(\"active\");\n }\n}\n\nfunction handleClick(e: MouseEvent) {\n const target = e.target as HTMLElement;\n const tab = target.closest<HTMLElement>(\"[data-sp-toggle='tab']\");\n if (tab) {\n select(tab);\n }\n}\n\nfunction findNextEnabledTab(\n tabs: HTMLElement[],\n startIndex: number,\n direction: 1 | -1\n): HTMLElement | null {\n const len = tabs.length;\n for (let i = 1; i <= len; i++) {\n const index = (startIndex + i * direction + len) % len;\n if (!tabs[index].hasAttribute(\"disabled\")) {\n return tabs[index];\n }\n }\n return null;\n}\n\nfunction handleKeydown(e: KeyboardEvent) {\n const target = e.target as HTMLElement;\n if (!target.classList.contains(\"tab\")) return;\n\n const tabList = target.closest(\".tab-list\");\n if (!tabList) return;\n\n const tabs = [...tabList.querySelectorAll<HTMLElement>(\".tab\")];\n const currentIndex = tabs.indexOf(target);\n\n let nextTab: HTMLElement | null = null;\n\n switch (e.key) {\n case \"ArrowLeft\":\n nextTab = findNextEnabledTab(tabs, currentIndex, -1);\n break;\n case \"ArrowRight\":\n nextTab = findNextEnabledTab(tabs, currentIndex, 1);\n break;\n case \"Home\":\n nextTab = tabs.find((t) => !t.hasAttribute(\"disabled\")) ?? null;\n break;\n case \"End\":\n nextTab = [...tabs].reverse().find((t) => !t.hasAttribute(\"disabled\")) ?? null;\n break;\n }\n\n if (nextTab) {\n e.preventDefault();\n nextTab.focus();\n select(nextTab);\n }\n}\n\n// Initialize global listeners\nlet initialized = false;\n\n(function init() {\n if (typeof document === \"undefined\" || initialized) return;\n initialized = true;\n\n document.addEventListener(\"click\", handleClick);\n document.addEventListener(\"keydown\", handleKeydown);\n})();\n","// Starting Point UI - JavaScript\n\nimport * as dialog from \"./dialog\";\nimport * as tabs from \"./tabs\";\n\nexport { dialog, tabs };\n\ndeclare global {\n interface Window {\n sp: { dialog: typeof dialog; tabs: typeof tabs };\n }\n}\n\nif (typeof window !== \"undefined\") {\n window.sp = { dialog, tabs };\n}\n"]}
1
+ {"version":3,"sources":["../src/js/dialog.ts","../src/js/utils.ts","../src/js/dropdown.ts","../src/js/tabs.ts","../src/js/index.ts"],"names":["dialog_exports","__export","close","open","toggle","FOCUSABLE_SELECTOR","getFocusableElements","container","el","waitForAnimations","elements","animations","a","BACKDROP_SELECTOR","PANEL_SELECTOR","getAnimatableElements","dialog","setDataState","state","isModal","focusable","handleKeydown","dialogEl","first","last","handleClick","target","toggleBtn","selector","dismissBtn","backdrop","initialized","dropdown_exports","getMenu","dropdown","getTrigger","getOpenDropdown","positionMenu","trigger","menu","placement","offsetValue","x","y","computePosition","offset","flip","shift","openDropdown","item","items","currentIndex","nextItem","handleFocusOut","relatedTarget","tabs_exports","select","tab","tabList","tabs","t","findNextEnabledTab","startIndex","direction","len","i","index","nextTab"],"mappings":"iEAAA,IAAA,CAAA,CAAA,MAAA,CAAA,cAAA,CAAA,IAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,GAAA,CAAA,IAAA,IAAA,CAAA,IAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,GAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,UAAA,CAAA,IAAA,CAAA,EAAA,CAAA,CAAA,IAAAA,CAAAA,CAAA,GAAAC,CAAAA,CAAAD,CAAAA,CAAA,WAAAE,CAAAA,CAAA,IAAA,CAAA,IAAAC,CAAAA,CAAA,MAAA,CAAA,IAAAC,ICEA,IAAMC,CAAAA,CAAqB,CACzB,SAAA,CACA,yBACA,uBAAA,CACA,wBAAA,CACA,0BAAA,CACA,iCAAA,CACA,kDAAA,CACA,iBAAA,CACA,iBAAA,CACA,mBAAA,CACA,QACF,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA,CAEJ,SAASC,CAAAA,CAAqBC,CAAAA,CAAuC,CAC1E,OAAO,CACL,GAAGA,CAAAA,CAAU,gBAAA,CAA8BF,CAAkB,CAC/D,CAAA,CAAE,MAAA,CAAQG,CAAAA,EAAOA,EAAG,YAAA,GAAiB,IAAI,CAC3C,CAEA,eAAsBC,CAAAA,CACpBC,CAAAA,CACe,CACf,IAAMC,EAAaD,CAAAA,CAAS,OAAA,CAASF,CAAAA,EAAOA,CAAAA,CAAG,eAAe,CAAA,CAC1DG,CAAAA,CAAW,MAAA,GAAW,GAC1B,MAAM,OAAA,CAAQ,GAAA,CAAIA,CAAAA,CAAW,IAAKC,CAAAA,EAAMA,CAAAA,CAAE,QAAQ,CAAC,EACrD,CDxBA,IAAMC,CAAAA,CAAoB,mCAAA,CACpBC,CAAAA,CAAiB,6BAAA,CAEvB,SAASC,CAAAA,CAAsBC,EAA0C,CACvE,OAAO,CACL,GAAGA,EAAO,gBAAA,CACR,CAAA,EAAGH,CAAiB,CAAA,EAAA,EAAKC,CAAc,CAAA,CACzC,CACF,CACF,CAEA,SAASG,CAAAA,CACPP,CAAAA,CACAQ,CAAAA,CACA,CACA,IAAA,IAAWV,CAAAA,IAAME,CAAAA,CACXQ,CAAAA,GAAU,KACZV,CAAAA,CAAG,eAAA,CAAgB,YAAY,CAAA,CAE/BA,EAAG,YAAA,CAAa,YAAA,CAAcU,CAAK,EAGzC,CAEA,SAASC,CAAAA,CAAQH,CAAAA,CAAoC,CACnD,OAAOA,CAAAA,CAAO,aAAA,CAAcH,CAAiB,IAAM,IACrD,CAEO,SAASV,CAAAA,CAAKa,EAA2B,CAC9CA,CAAAA,CAAO,IAAA,EAAK,CACZ,IAAMN,CAAAA,CAAWK,CAAAA,CAAsBC,CAAM,CAAA,CAI7C,GAHAC,CAAAA,CAAaP,CAAAA,CAAU,MAAM,CAAA,CAGzBS,EAAQH,CAAM,CAAA,CAAG,CACnB,IAAMI,EAAYd,CAAAA,CAAqBU,CAAM,CAAA,CACzCI,CAAAA,CAAU,MAAA,CAAS,CAAA,EACrBA,CAAAA,CAAU,CAAC,EAAE,KAAA,GAEjB,CACF,CAEA,eAAsBlB,CAAAA,CAAMc,CAAAA,CAA2B,CACrD,IAAMN,EAAWK,CAAAA,CAAsBC,CAAM,CAAA,CAC7CC,CAAAA,CAAaP,CAAAA,CAAU,QAAQ,CAAA,CAE/B,MAAMD,EAAkBC,CAAQ,CAAA,CAEhCM,CAAAA,CAAO,KAAA,GACPC,CAAAA,CAAaP,CAAAA,CAAU,IAAI,EAC7B,CAEO,SAASN,CAAAA,CAAOY,CAAAA,CAA2B,CAC5CA,CAAAA,CAAO,IAAA,CACTd,CAAAA,CAAMc,CAAM,EAEZb,CAAAA,CAAKa,CAAM,EAEf,CAGA,SAASK,CAAAA,CAAc,CAAA,CAAkB,CACvC,IAAMC,EAAY,CAAA,CAAE,MAAA,CAAuB,OAAA,CACzC,QACF,EACA,GAAKA,CAAAA,EAAU,IAAA,CAGf,CAAA,GAAI,EAAE,GAAA,GAAQ,QAAA,CAAU,CACtB,CAAA,CAAE,gBAAe,CACAA,CAAAA,CAAS,OAAA,CAAQ,UAAA,GAAe,UAE/CpB,CAAAA,CAAMoB,CAAQ,CAAA,CAEhB,MACF,CAGA,GAAI,CAAA,CAAE,GAAA,GAAQ,OAASH,CAAAA,CAAQG,CAAQ,CAAA,CAAG,CACxC,IAAMF,CAAAA,CAAYd,CAAAA,CAAqBgB,CAAQ,CAAA,CAC/C,GAAIF,CAAAA,CAAU,MAAA,GAAW,CAAA,CAAG,OAE5B,IAAMG,CAAAA,CAAQH,CAAAA,CAAU,CAAC,CAAA,CACnBI,EAAOJ,CAAAA,CAAUA,CAAAA,CAAU,MAAA,CAAS,CAAC,EAEvC,CAAA,CAAE,QAAA,EAAY,QAAA,CAAS,aAAA,GAAkBG,GAC3C,CAAA,CAAE,cAAA,EAAe,CACjBC,CAAAA,CAAK,KAAA,EAAM,EACF,CAAC,CAAA,CAAE,UAAY,QAAA,CAAS,aAAA,GAAkBA,CAAAA,GACnD,CAAA,CAAE,gBAAe,CACjBD,CAAAA,CAAM,KAAA,EAAM,EAEhB,EACF,CAGA,SAASE,CAAAA,CAAY,CAAA,CAAe,CAClC,IAAMC,CAAAA,CAAS,CAAA,CAAE,MAAA,CAGXC,EAAYD,CAAAA,CAAO,OAAA,CAAqB,2BAA2B,CAAA,CACzE,GAAIC,CAAAA,CAAW,CACb,IAAMC,CAAAA,CAAWD,EAAU,OAAA,CAAQ,QAAA,CACnC,GAAIC,CAAAA,CAAU,CACZ,IAAMN,CAAAA,CAAW,QAAA,CAAS,cAAiCM,CAAQ,CAAA,CAC/DN,CAAAA,EACFnB,CAAAA,CAAKmB,CAAQ,EAEjB,CACA,MACF,CAGA,IAAMO,CAAAA,CAAaH,CAAAA,CAAO,OAAA,CAAqB,4BAA4B,CAAA,CAC3E,GAAIG,CAAAA,CAAY,CACd,IAAMP,CAAAA,CAAWO,CAAAA,CAAW,OAAA,CAA2B,QAAQ,EAC3DP,CAAAA,EACFpB,CAAAA,CAAMoB,CAAQ,CAAA,CAEhB,MACF,CAGA,IAAMQ,CAAAA,CAAWJ,CAAAA,CAAO,OAAA,CAAqBb,CAAiB,CAAA,CAC9D,GAAIiB,EAAU,CACZ,IAAMR,CAAAA,CAAWQ,CAAAA,CAAS,QAA2B,QAAQ,CAAA,CACzDR,CAAAA,GAEeA,CAAAA,CAAS,QAAQ,UAAA,GAAe,QAAA,EAE/CpB,CAAAA,CAAMoB,CAAQ,GAGpB,CACF,CAGA,IAAIS,CAAAA,CAAc,OAEjB,UAAgB,CACX,OAAO,QAAA,CAAa,KAAeA,CAAAA,GACvCA,CAAAA,CAAc,IAAA,CAEd,QAAA,CAAS,iBAAiB,OAAA,CAASN,CAAW,CAAA,CAC9C,QAAA,CAAS,gBAAA,CAAiB,SAAA,CAAWJ,CAAa,CAAA,EACpD,IAAG,CErJH,IAAAW,CAAAA,CAAA,GAAA/B,EAAA+B,CAAAA,CAAA,CAAA,KAAA,CAAA,IAAA9B,CAAAA,CAAA,IAAA,CAAA,IAAAC,EAAA,MAAA,CAAA,IAAAC,CAAAA,CAAAA,CAAAA,CAWA,SAAS6B,EAAQC,CAAAA,CAA2C,CAC1D,OAAOA,CAAAA,CAAS,cAAc,gBAAgB,CAChD,CAEA,SAASC,CAAAA,CAAWD,CAAAA,CAA2C,CAC7D,OAAOA,EAAS,aAAA,CAAc,6BAA6B,CAC7D,CAEA,SAASE,CAAAA,EAAsC,CAE7C,OADiB,QAAA,CAAS,cAAc,qBAAqB,CAAA,EAC5C,OAAA,CAAQ,WAAW,GAAK,IAC3C,CAEA,eAAeC,CAAAA,CAAaH,EAAuB,CACjD,IAAMI,CAAAA,CAAUH,CAAAA,CAAWD,CAAQ,CAAA,CAC7BK,CAAAA,CAAON,CAAAA,CAAQC,CAAQ,EAC7B,GAAI,CAACI,CAAAA,EAAW,CAACC,CAAAA,CAAM,OAEvB,IAAMC,CAAAA,CAAaN,EAAS,OAAA,CAAQ,WAAA,EAA6B,YAAA,CAC3DO,CAAAA,CAAc,SAASP,CAAAA,CAAS,OAAA,CAAQ,QAAA,EAAY,GAAA,CAAK,EAAE,CAAA,CAE3D,CAAE,CAAA,CAAAQ,CAAAA,CAAG,CAAA,CAAAC,CAAE,CAAA,CAAI,MAAMC,gBAAgBN,CAAAA,CAASC,CAAAA,CAAM,CACpD,SAAA,CAAAC,EACA,UAAA,CAAY,CAACK,MAAAA,CAAOJ,CAAW,EAAGK,IAAAA,EAAK,CAAGC,KAAAA,CAAM,CAAE,OAAA,CAAS,CAAE,CAAC,CAAC,CACjE,CAAC,CAAA,CAED,MAAA,CAAO,MAAA,CAAOR,EAAK,KAAA,CAAO,CACxB,IAAA,CAAM,CAAA,EAAGG,CAAC,CAAA,EAAA,CAAA,CACV,GAAA,CAAK,CAAA,EAAGC,CAAC,IACX,CAAC,EACH,CAEO,SAASxC,EAAK+B,CAAAA,CAAuB,CAC1C,IAAMK,CAAAA,CAAON,EAAQC,CAAQ,CAAA,CAC7B,GAAI,CAACK,GAAQA,CAAAA,CAAK,SAAA,CAAU,QAAA,CAAS,MAAM,CAAA,CAAG,OAG9C,IAAMS,CAAAA,CAAeZ,GAAgB,CACjCY,CAAAA,EACF9C,CAAAA,CAAM8C,CAAY,EAGpB,IAAMV,CAAAA,CAAUH,CAAAA,CAAWD,CAAQ,EAEnCK,CAAAA,CAAK,SAAA,CAAU,GAAA,CAAI,MAAM,EACzBD,CAAAA,EAAS,YAAA,CAAa,eAAA,CAAiB,MAAM,EAC7CC,CAAAA,CAAK,YAAA,CAAa,YAAA,CAAc,MAAM,EAEtCF,CAAAA,CAAaH,CAAQ,EACvB,CAEA,eAAsBhC,CAAAA,CAAMgC,CAAAA,CAAuB,CACjD,IAAMK,CAAAA,CAAON,CAAAA,CAAQC,CAAQ,CAAA,CAC7B,GAAI,CAACK,CAAAA,EAAQ,CAACA,CAAAA,CAAK,UAAU,QAAA,CAAS,MAAM,CAAA,CAAG,OAE/BJ,EAAWD,CAAQ,CAAA,EAE1B,YAAA,CAAa,eAAA,CAAiB,OAAO,CAAA,CAC9CK,CAAAA,CAAK,YAAA,CAAa,YAAA,CAAc,QAAQ,CAAA,CAExC,MAAM9B,CAAAA,CAAkB,CAAC8B,CAAI,CAAC,CAAA,CAE9BA,CAAAA,CAAK,SAAA,CAAU,OAAO,MAAM,CAAA,CAC5BA,CAAAA,CAAK,eAAA,CAAgB,YAAY,EACnC,CAEO,SAASnC,EAAO8B,CAAAA,CAAuB,CAC/BD,CAAAA,CAAQC,CAAQ,GACnB,SAAA,CAAU,QAAA,CAAS,MAAM,CAAA,CACjChC,EAAMgC,CAAQ,CAAA,CAEd/B,CAAAA,CAAK+B,CAAQ,EAEjB,CAEA,SAAST,CAAAA,CAAY,EAAe,CAClC,IAAMC,CAAAA,CAAS,CAAA,CAAE,OAGXC,CAAAA,CAAYD,CAAAA,CAAO,OAAA,CAAqB,6BAA6B,EAC3E,GAAIC,CAAAA,CAAW,CACb,IAAMO,CAAAA,CAAWP,CAAAA,CAAU,OAAA,CAAqB,WAAW,EACvDO,CAAAA,GACF,CAAA,CAAE,cAAA,EAAe,CACjB9B,EAAO8B,CAAQ,CAAA,CAAA,CAEjB,MACF,CAGA,IAAMe,CAAAA,CAAOvB,CAAAA,CAAO,OAAA,CAAqB,gBAAgB,EACzD,GAAIuB,CAAAA,CAAM,CAER,GAAIA,EAAK,YAAA,CAAa,eAAe,CAAA,GAAM,MAAA,CAAQ,CACjD,CAAA,CAAE,cAAA,EAAe,CACjB,MACF,CACA,IAAMf,CAAAA,CAAWe,CAAAA,CAAK,OAAA,CAAqB,WAAW,CAAA,CAClDf,CAAAA,EACFhC,CAAAA,CAAMgC,CAAQ,CAAA,CAEhB,MACF,CAGA,IAAMc,EAAeZ,CAAAA,EAAgB,CACjCY,CAAAA,EAAgB,CAACA,EAAa,QAAA,CAAStB,CAAM,CAAA,EAC/CxB,CAAAA,CAAM8C,CAAY,EAEtB,CAEA,SAAS3B,EAAc,CAAA,CAAkB,CACvC,IAAMK,CAAAA,CAAS,EAAE,MAAA,CACXQ,CAAAA,CAAWR,CAAAA,CAAO,OAAA,CAAqB,WAAW,CAAA,CAGlDsB,CAAAA,CAAeZ,CAAAA,EAAgB,CACrC,GAAI,CAAA,CAAE,GAAA,GAAQ,QAAA,EAAYY,EAAc,CACtC,CAAA,CAAE,cAAA,EAAe,CACjB,IAAMV,CAAAA,CAAUH,CAAAA,CAAWa,CAAY,CAAA,CACvC9C,EAAM8C,CAAY,CAAA,CAClBV,CAAAA,EAAS,KAAA,GACT,MACF,CAGA,GAAA,CACG,CAAA,CAAE,MAAQ,OAAA,EAAW,CAAA,CAAE,GAAA,GAAQ,GAAA,GAChCZ,EAAO,OAAA,CAAQ,6BAA6B,CAAA,CAC5C,CACA,EAAE,cAAA,EAAe,CACbQ,CAAAA,EACF9B,CAAAA,CAAO8B,CAAQ,CAAA,CAEjB,MACF,CAGA,IAAMK,CAAAA,CAAOL,CAAAA,CAAWD,CAAAA,CAAQC,CAAQ,EAAI,IAAA,CAC5C,GAAI,CAACK,CAAAA,EAAM,UAAU,QAAA,CAAS,MAAM,CAAA,CAAG,OAEvC,IAAMW,CAAAA,CAAQ,CACZ,GAAGX,EAAK,gBAAA,CACN,4CACF,CACF,CAAA,CACMY,EAAeD,CAAAA,CAAM,OAAA,CAAQxB,CAAM,CAAA,CAErC0B,EAA+B,IAAA,CAEnC,OAAQ,CAAA,CAAE,GAAA,EACR,KAAK,WAAA,CACH,CAAA,CAAE,gBAAe,CACbD,CAAAA,CAAe,CAAA,CACjBC,CAAAA,CAAWF,EAAM,CAAC,CAAA,CAElBE,CAAAA,CAAWF,CAAAA,CAAAA,CAAOC,EAAe,CAAA,EAAKD,CAAAA,CAAM,MAAM,CAAA,CAEpD,MACF,KAAK,SAAA,CACH,CAAA,CAAE,cAAA,GACEC,CAAAA,CAAe,CAAA,CACjBC,CAAAA,CAAWF,CAAAA,CAAMA,EAAM,MAAA,CAAS,CAAC,CAAA,CAEjCE,CAAAA,CAAWF,GAAOC,CAAAA,CAAe,CAAA,CAAID,CAAAA,CAAM,MAAA,EAAUA,CAAAA,CAAM,MAAM,CAAA,CAEnE,MACF,KAAK,MAAA,CACH,CAAA,CAAE,cAAA,EAAe,CACjBE,EAAWF,CAAAA,CAAM,CAAC,CAAA,CAClB,MACF,KAAK,KAAA,CACH,CAAA,CAAE,cAAA,EAAe,CACjBE,EAAWF,CAAAA,CAAMA,CAAAA,CAAM,MAAA,CAAS,CAAC,EACjC,KACJ,CAEIE,CAAAA,EACFA,CAAAA,CAAS,QAEb,CAEA,SAASC,CAAAA,CAAe,EAAe,CACrC,IAAML,CAAAA,CAAeZ,CAAAA,EAAgB,CACrC,GAAI,CAACY,CAAAA,CAAc,OAEnB,IAAMM,CAAAA,CAAgB,CAAA,CAAE,aAAA,CAAA,CAGpB,CAACA,CAAAA,EAAiB,CAACN,CAAAA,CAAa,QAAA,CAASM,CAAa,CAAA,GACxDpD,CAAAA,CAAM8C,CAAY,EAEtB,CAGA,IAAIjB,CAAAA,CAAc,KAAA,CAAA,CAEjB,UAAgB,CACX,OAAO,QAAA,CAAa,GAAA,EAAeA,CAAAA,GACvCA,EAAc,IAAA,CAEd,QAAA,CAAS,gBAAA,CAAiB,OAAA,CAASN,CAAW,CAAA,CAC9C,QAAA,CAAS,gBAAA,CAAiB,SAAA,CAAWJ,CAAa,CAAA,CAClD,QAAA,CAAS,gBAAA,CAAiB,WAAYgC,CAAc,CAAA,EACtD,CAAA,GAAG,KCvNHE,CAAAA,CAAA,GAAAtD,CAAAA,CAAAsD,CAAAA,CAAA,YAAAC,CAAAA,CAAAA,CAAAA,CAEO,SAASA,CAAAA,CAAOC,CAAAA,CAAkB,CACvC,GAAIA,CAAAA,CAAI,YAAA,CAAa,UAAU,CAAA,CAAG,OAElC,IAAMC,CAAAA,CAAUD,EAAI,OAAA,CAAQ,WAAW,CAAA,CACvC,GAAI,CAACC,CAAAA,CAAS,OAGd,IAAMC,CAAAA,CAAOD,CAAAA,CAAQ,gBAAA,CAA8B,MAAM,CAAA,CACzD,QAAWE,CAAAA,IAAKD,CAAAA,CAAM,CACpBC,CAAAA,CAAE,UAAU,MAAA,CAAO,QAAQ,CAAA,CAC3BA,CAAAA,CAAE,aAAa,eAAA,CAAiB,OAAO,CAAA,CACvCA,CAAAA,CAAE,aAAa,UAAA,CAAY,IAAI,CAAA,CAC/B,IAAMhC,EAAWgC,CAAAA,CAAE,OAAA,CAAQ,QAAA,CACvBhC,CAAAA,EACF,SAAS,aAAA,CAAcA,CAAQ,CAAA,EAAG,SAAA,CAAU,OAAO,QAAQ,EAE/D,CAGA6B,CAAAA,CAAI,SAAA,CAAU,GAAA,CAAI,QAAQ,CAAA,CAC1BA,EAAI,YAAA,CAAa,eAAA,CAAiB,MAAM,CAAA,CACxCA,EAAI,YAAA,CAAa,UAAA,CAAY,GAAG,CAAA,CAEhC,IAAM7B,CAAAA,CAAW6B,CAAAA,CAAI,OAAA,CAAQ,QAAA,CACzB7B,CAAAA,EACF,QAAA,CAAS,aAAA,CAAcA,CAAQ,GAAG,SAAA,CAAU,GAAA,CAAI,QAAQ,EAE5D,CAEA,SAASH,CAAAA,CAAY,CAAA,CAAe,CAElC,IAAMgC,CAAAA,CADS,CAAA,CAAE,MAAA,CACE,OAAA,CAAqB,wBAAwB,CAAA,CAC5DA,CAAAA,EACFD,CAAAA,CAAOC,CAAG,EAEd,CAEA,SAASI,CAAAA,CACPF,EACAG,CAAAA,CACAC,CAAAA,CACoB,CACpB,IAAMC,EAAML,CAAAA,CAAK,MAAA,CACjB,IAAA,IAASM,CAAAA,CAAI,EAAGA,CAAAA,EAAKD,CAAAA,CAAKC,CAAAA,EAAAA,CAAK,CAC7B,IAAMC,CAAAA,CAAAA,CAASJ,CAAAA,CAAaG,CAAAA,CAAIF,CAAAA,CAAYC,GAAOA,CAAAA,CACnD,GAAI,CAACL,CAAAA,CAAKO,CAAK,CAAA,CAAE,YAAA,CAAa,UAAU,CAAA,CACtC,OAAOP,CAAAA,CAAKO,CAAK,CAErB,CACA,OAAO,IACT,CAEA,SAAS7C,EAAc,CAAA,CAAkB,CACvC,IAAMK,CAAAA,CAAS,EAAE,MAAA,CACjB,GAAI,CAACA,CAAAA,CAAO,SAAA,CAAU,QAAA,CAAS,KAAK,CAAA,CAAG,OAEvC,IAAMgC,CAAAA,CAAUhC,CAAAA,CAAO,OAAA,CAAQ,WAAW,CAAA,CAC1C,GAAI,CAACgC,CAAAA,CAAS,OAEd,IAAMC,CAAAA,CAAO,CAAC,GAAGD,CAAAA,CAAQ,gBAAA,CAA8B,MAAM,CAAC,EACxDP,CAAAA,CAAeQ,CAAAA,CAAK,OAAA,CAAQjC,CAAM,EAEpCyC,CAAAA,CAA8B,IAAA,CAElC,OAAQ,CAAA,CAAE,KACR,KAAK,WAAA,CACHA,CAAAA,CAAUN,EAAmBF,CAAAA,CAAMR,CAAAA,CAAc,EAAE,CAAA,CACnD,MACF,KAAK,YAAA,CACHgB,CAAAA,CAAUN,CAAAA,CAAmBF,EAAMR,CAAAA,CAAc,CAAC,CAAA,CAClD,MACF,KAAK,MAAA,CACHgB,CAAAA,CAAUR,CAAAA,CAAK,IAAA,CAAMC,CAAAA,EAAM,CAACA,CAAAA,CAAE,YAAA,CAAa,UAAU,CAAC,CAAA,EAAK,IAAA,CAC3D,MACF,KAAK,KAAA,CACHO,CAAAA,CAAU,CAAC,GAAGR,CAAI,CAAA,CAAE,OAAA,EAAQ,CAAE,IAAA,CAAMC,GAAM,CAACA,CAAAA,CAAE,YAAA,CAAa,UAAU,CAAC,CAAA,EAAK,IAAA,CAC1E,KACJ,CAEIO,IACF,CAAA,CAAE,cAAA,EAAe,CACjBA,CAAAA,CAAQ,OAAM,CACdX,CAAAA,CAAOW,CAAO,CAAA,EAElB,CAGA,IAAIpC,CAAAA,CAAc,KAAA,CAAA,CAEjB,UAAgB,CACX,OAAO,QAAA,CAAa,GAAA,EAAeA,IACvCA,CAAAA,CAAc,IAAA,CAEd,QAAA,CAAS,gBAAA,CAAiB,QAASN,CAAW,CAAA,CAC9C,QAAA,CAAS,gBAAA,CAAiB,UAAWJ,CAAa,CAAA,EACpD,CAAA,GAAG,CCnFC,OAAO,MAAA,CAAW,GAAA,GACpB,MAAA,CAAO,EAAA,CAAK,CAAE,MAAA,CAAArB,CAAAA,CAAQ,QAAA,CAAAgC,CAAAA,CAAU,KAAAuB,CAAK,CAAA,CAAA","file":"index.js","sourcesContent":["// Starting Point UI Dialog Module\n\nimport { getFocusableElements, waitForAnimations } from \"./utils\";\n\nconst BACKDROP_SELECTOR = \".dialog-backdrop, .sheet-backdrop\";\nconst PANEL_SELECTOR = \".dialog-panel, .sheet-panel\";\n\nfunction getAnimatableElements(dialog: HTMLDialogElement): HTMLElement[] {\n return [\n ...dialog.querySelectorAll<HTMLElement>(\n `${BACKDROP_SELECTOR}, ${PANEL_SELECTOR}`\n ),\n ];\n}\n\nfunction setDataState(\n elements: HTMLElement[],\n state: \"open\" | \"closed\" | null\n) {\n for (const el of elements) {\n if (state === null) {\n el.removeAttribute(\"data-state\");\n } else {\n el.setAttribute(\"data-state\", state);\n }\n }\n}\n\nfunction isModal(dialog: HTMLDialogElement): boolean {\n return dialog.querySelector(BACKDROP_SELECTOR) !== null;\n}\n\nexport function open(dialog: HTMLDialogElement) {\n dialog.show();\n const elements = getAnimatableElements(dialog);\n setDataState(elements, \"open\");\n\n // Focus first focusable element in modal dialogs\n if (isModal(dialog)) {\n const focusable = getFocusableElements(dialog);\n if (focusable.length > 0) {\n focusable[0].focus();\n }\n }\n}\n\nexport async function close(dialog: HTMLDialogElement) {\n const elements = getAnimatableElements(dialog);\n setDataState(elements, \"closed\");\n\n await waitForAnimations(elements);\n\n dialog.close();\n setDataState(elements, null);\n}\n\nexport function toggle(dialog: HTMLDialogElement) {\n if (dialog.open) {\n close(dialog);\n } else {\n open(dialog);\n }\n}\n\n// Handle keydown for Escape and focus trapping\nfunction handleKeydown(e: KeyboardEvent) {\n const dialogEl = (e.target as HTMLElement).closest<HTMLDialogElement>(\n \"dialog\"\n );\n if (!dialogEl?.open) return;\n\n // Handle Escape key\n if (e.key === \"Escape\") {\n e.preventDefault();\n const isStatic = dialogEl.dataset.spBackdrop === \"static\";\n if (!isStatic) {\n close(dialogEl);\n }\n return;\n }\n\n // Handle Tab key for focus trapping in modals\n if (e.key === \"Tab\" && isModal(dialogEl)) {\n const focusable = getFocusableElements(dialogEl);\n if (focusable.length === 0) return;\n\n const first = focusable[0];\n const last = focusable[focusable.length - 1];\n\n if (e.shiftKey && document.activeElement === first) {\n e.preventDefault();\n last.focus();\n } else if (!e.shiftKey && document.activeElement === last) {\n e.preventDefault();\n first.focus();\n }\n }\n}\n\n// Global click handler for data attributes\nfunction handleClick(e: MouseEvent) {\n const target = e.target as HTMLElement;\n\n // Handle toggle buttons\n const toggleBtn = target.closest<HTMLElement>(\"[data-sp-toggle='dialog']\");\n if (toggleBtn) {\n const selector = toggleBtn.dataset.spTarget;\n if (selector) {\n const dialogEl = document.querySelector<HTMLDialogElement>(selector);\n if (dialogEl) {\n open(dialogEl);\n }\n }\n return;\n }\n\n // Handle dismiss buttons\n const dismissBtn = target.closest<HTMLElement>(\"[data-sp-dismiss='dialog']\");\n if (dismissBtn) {\n const dialogEl = dismissBtn.closest<HTMLDialogElement>(\"dialog\");\n if (dialogEl) {\n close(dialogEl);\n }\n return;\n }\n\n // Handle backdrop clicks\n const backdrop = target.closest<HTMLElement>(BACKDROP_SELECTOR);\n if (backdrop) {\n const dialogEl = backdrop.closest<HTMLDialogElement>(\"dialog\");\n if (dialogEl) {\n // Static backdrop prevents closing via click\n const isStatic = dialogEl.dataset.spBackdrop === \"static\";\n if (!isStatic) {\n close(dialogEl);\n }\n }\n }\n}\n\n// Initialize global listeners\nlet initialized = false;\n\n(function init() {\n if (typeof document === \"undefined\" || initialized) return;\n initialized = true;\n\n document.addEventListener(\"click\", handleClick);\n document.addEventListener(\"keydown\", handleKeydown);\n})();\n","// Starting Point UI Utilities\n\nconst FOCUSABLE_SELECTOR = [\n \"a[href]\",\n \"button:not([disabled])\",\n \"input:not([disabled])\",\n \"select:not([disabled])\",\n \"textarea:not([disabled])\",\n \"[tabindex]:not([tabindex='-1'])\",\n \"[contenteditable]:not([contenteditable='false'])\",\n \"audio[controls]\",\n \"video[controls]\",\n \"details > summary\",\n \"iframe\",\n].join(\", \");\n\nexport function getFocusableElements(container: HTMLElement): HTMLElement[] {\n return [\n ...container.querySelectorAll<HTMLElement>(FOCUSABLE_SELECTOR),\n ].filter((el) => el.offsetParent !== null);\n}\n\nexport async function waitForAnimations(\n elements: HTMLElement[]\n): Promise<void> {\n const animations = elements.flatMap((el) => el.getAnimations());\n if (animations.length === 0) return;\n await Promise.all(animations.map((a) => a.finished));\n}\n","// Starting Point UI Dropdown Module\n\nimport {\n computePosition,\n flip,\n shift,\n offset,\n type Placement,\n} from \"@floating-ui/dom\";\nimport { waitForAnimations } from \"./utils\";\n\nfunction getMenu(dropdown: HTMLElement): HTMLElement | null {\n return dropdown.querySelector(\".dropdown-menu\");\n}\n\nfunction getTrigger(dropdown: HTMLElement): HTMLElement | null {\n return dropdown.querySelector(\"[data-sp-toggle='dropdown']\");\n}\n\nfunction getOpenDropdown(): HTMLElement | null {\n const openMenu = document.querySelector(\".dropdown-menu.open\");\n return openMenu?.closest(\".dropdown\") ?? null;\n}\n\nasync function positionMenu(dropdown: HTMLElement) {\n const trigger = getTrigger(dropdown);\n const menu = getMenu(dropdown);\n if (!trigger || !menu) return;\n\n const placement = (dropdown.dataset.spPlacement as Placement) || \"bottom-end\";\n const offsetValue = parseInt(dropdown.dataset.spOffset || \"4\", 10);\n\n const { x, y } = await computePosition(trigger, menu, {\n placement,\n middleware: [offset(offsetValue), flip(), shift({ padding: 8 })],\n });\n\n Object.assign(menu.style, {\n left: `${x}px`,\n top: `${y}px`,\n });\n}\n\nexport function open(dropdown: HTMLElement) {\n const menu = getMenu(dropdown);\n if (!menu || menu.classList.contains(\"open\")) return;\n\n // Close any other open dropdown first\n const openDropdown = getOpenDropdown();\n if (openDropdown) {\n close(openDropdown);\n }\n\n const trigger = getTrigger(dropdown);\n\n menu.classList.add(\"open\");\n trigger?.setAttribute(\"aria-expanded\", \"true\");\n menu.setAttribute(\"data-state\", \"open\");\n\n positionMenu(dropdown);\n}\n\nexport async function close(dropdown: HTMLElement) {\n const menu = getMenu(dropdown);\n if (!menu || !menu.classList.contains(\"open\")) return;\n\n const trigger = getTrigger(dropdown);\n\n trigger?.setAttribute(\"aria-expanded\", \"false\");\n menu.setAttribute(\"data-state\", \"closed\");\n\n await waitForAnimations([menu]);\n\n menu.classList.remove(\"open\");\n menu.removeAttribute(\"data-state\");\n}\n\nexport function toggle(dropdown: HTMLElement) {\n const menu = getMenu(dropdown);\n if (menu?.classList.contains(\"open\")) {\n close(dropdown);\n } else {\n open(dropdown);\n }\n}\n\nfunction handleClick(e: MouseEvent) {\n const target = e.target as HTMLElement;\n\n // Handle toggle button clicks\n const toggleBtn = target.closest<HTMLElement>(\"[data-sp-toggle='dropdown']\");\n if (toggleBtn) {\n const dropdown = toggleBtn.closest<HTMLElement>(\".dropdown\");\n if (dropdown) {\n e.preventDefault();\n toggle(dropdown);\n }\n return;\n }\n\n // Handle item clicks\n const item = target.closest<HTMLElement>(\".dropdown-item\");\n if (item) {\n // Ignore disabled items\n if (item.getAttribute(\"aria-disabled\") === \"true\") {\n e.preventDefault();\n return;\n }\n const dropdown = item.closest<HTMLElement>(\".dropdown\");\n if (dropdown) {\n close(dropdown);\n }\n return;\n }\n\n // Close dropdown when clicking outside\n const openDropdown = getOpenDropdown();\n if (openDropdown && !openDropdown.contains(target)) {\n close(openDropdown);\n }\n}\n\nfunction handleKeydown(e: KeyboardEvent) {\n const target = e.target as HTMLElement;\n const dropdown = target.closest<HTMLElement>(\".dropdown\");\n\n // Handle Escape to close\n const openDropdown = getOpenDropdown();\n if (e.key === \"Escape\" && openDropdown) {\n e.preventDefault();\n const trigger = getTrigger(openDropdown);\n close(openDropdown);\n trigger?.focus();\n return;\n }\n\n // Handle Enter/Space on trigger\n if (\n (e.key === \"Enter\" || e.key === \" \") &&\n target.matches(\"[data-sp-toggle='dropdown']\")\n ) {\n e.preventDefault();\n if (dropdown) {\n toggle(dropdown);\n }\n return;\n }\n\n // Handle arrow navigation within menu\n const menu = dropdown ? getMenu(dropdown) : null;\n if (!menu?.classList.contains(\"open\")) return;\n\n const items = [\n ...menu.querySelectorAll<HTMLElement>(\n \".dropdown-item:not([aria-disabled='true'])\"\n ),\n ];\n const currentIndex = items.indexOf(target);\n\n let nextItem: HTMLElement | null = null;\n\n switch (e.key) {\n case \"ArrowDown\":\n e.preventDefault();\n if (currentIndex < 0) {\n nextItem = items[0];\n } else {\n nextItem = items[(currentIndex + 1) % items.length];\n }\n break;\n case \"ArrowUp\":\n e.preventDefault();\n if (currentIndex < 0) {\n nextItem = items[items.length - 1];\n } else {\n nextItem = items[(currentIndex - 1 + items.length) % items.length];\n }\n break;\n case \"Home\":\n e.preventDefault();\n nextItem = items[0];\n break;\n case \"End\":\n e.preventDefault();\n nextItem = items[items.length - 1];\n break;\n }\n\n if (nextItem) {\n nextItem.focus();\n }\n}\n\nfunction handleFocusOut(e: FocusEvent) {\n const openDropdown = getOpenDropdown();\n if (!openDropdown) return;\n\n const relatedTarget = e.relatedTarget as HTMLElement | null;\n\n // If focus is moving outside the dropdown, close it\n if (!relatedTarget || !openDropdown.contains(relatedTarget)) {\n close(openDropdown);\n }\n}\n\n// Initialize global listeners\nlet initialized = false;\n\n(function init() {\n if (typeof document === \"undefined\" || initialized) return;\n initialized = true;\n\n document.addEventListener(\"click\", handleClick);\n document.addEventListener(\"keydown\", handleKeydown);\n document.addEventListener(\"focusout\", handleFocusOut);\n})();\n","// Starting Point UI Tabs Module\n\nexport function select(tab: HTMLElement) {\n if (tab.hasAttribute(\"disabled\")) return;\n\n const tabList = tab.closest(\".tab-list\");\n if (!tabList) return;\n\n // Deselect all tabs in the list\n const tabs = tabList.querySelectorAll<HTMLElement>(\".tab\");\n for (const t of tabs) {\n t.classList.remove(\"active\");\n t.setAttribute(\"aria-selected\", \"false\");\n t.setAttribute(\"tabindex\", \"-1\");\n const selector = t.dataset.spTarget;\n if (selector) {\n document.querySelector(selector)?.classList.remove(\"active\");\n }\n }\n\n // Select the clicked tab\n tab.classList.add(\"active\");\n tab.setAttribute(\"aria-selected\", \"true\");\n tab.setAttribute(\"tabindex\", \"0\");\n\n const selector = tab.dataset.spTarget;\n if (selector) {\n document.querySelector(selector)?.classList.add(\"active\");\n }\n}\n\nfunction handleClick(e: MouseEvent) {\n const target = e.target as HTMLElement;\n const tab = target.closest<HTMLElement>(\"[data-sp-toggle='tab']\");\n if (tab) {\n select(tab);\n }\n}\n\nfunction findNextEnabledTab(\n tabs: HTMLElement[],\n startIndex: number,\n direction: 1 | -1\n): HTMLElement | null {\n const len = tabs.length;\n for (let i = 1; i <= len; i++) {\n const index = (startIndex + i * direction + len) % len;\n if (!tabs[index].hasAttribute(\"disabled\")) {\n return tabs[index];\n }\n }\n return null;\n}\n\nfunction handleKeydown(e: KeyboardEvent) {\n const target = e.target as HTMLElement;\n if (!target.classList.contains(\"tab\")) return;\n\n const tabList = target.closest(\".tab-list\");\n if (!tabList) return;\n\n const tabs = [...tabList.querySelectorAll<HTMLElement>(\".tab\")];\n const currentIndex = tabs.indexOf(target);\n\n let nextTab: HTMLElement | null = null;\n\n switch (e.key) {\n case \"ArrowLeft\":\n nextTab = findNextEnabledTab(tabs, currentIndex, -1);\n break;\n case \"ArrowRight\":\n nextTab = findNextEnabledTab(tabs, currentIndex, 1);\n break;\n case \"Home\":\n nextTab = tabs.find((t) => !t.hasAttribute(\"disabled\")) ?? null;\n break;\n case \"End\":\n nextTab = [...tabs].reverse().find((t) => !t.hasAttribute(\"disabled\")) ?? null;\n break;\n }\n\n if (nextTab) {\n e.preventDefault();\n nextTab.focus();\n select(nextTab);\n }\n}\n\n// Initialize global listeners\nlet initialized = false;\n\n(function init() {\n if (typeof document === \"undefined\" || initialized) return;\n initialized = true;\n\n document.addEventListener(\"click\", handleClick);\n document.addEventListener(\"keydown\", handleKeydown);\n})();\n","// Starting Point UI - JavaScript\n\nimport * as dialog from \"./dialog\";\nimport * as dropdown from \"./dropdown\";\nimport * as tabs from \"./tabs\";\n\nexport { dialog, dropdown, tabs };\n\ndeclare global {\n interface Window {\n sp: { dialog: typeof dialog; dropdown: typeof dropdown; tabs: typeof tabs };\n }\n}\n\nif (typeof window !== \"undefined\") {\n window.sp = { dialog, dropdown, tabs };\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "starting-point-ui",
3
- "version": "0.1.0",
3
+ "version": "0.3.0",
4
4
  "description": "A component library built on top of Tailwind CSS. Framework agnostic, easy to customize, open source, and works in any project.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -48,5 +48,8 @@
48
48
  },
49
49
  "publishConfig": {
50
50
  "access": "public"
51
+ },
52
+ "dependencies": {
53
+ "@floating-ui/dom": "^1.7.4"
51
54
  }
52
55
  }