@giddaa-housing/ui 3.9.0 → 3.10.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/styles.css CHANGED
@@ -19,6 +19,7 @@
19
19
  --color-white: #fff;
20
20
  --spacing: 0.25rem;
21
21
  --container-xs: 20rem;
22
+ --container-md: 28rem;
22
23
  --container-3xl: 48rem;
23
24
  --container-7xl: 80rem;
24
25
  --text-xs: 0.75rem;
@@ -167,6 +168,7 @@
167
168
  --animate-round-sonar-glow: round-sonar-glow 1.5s ease-out infinite;
168
169
  --animate-sonar-wave: sonar-wave 1.5s cubic-bezier(0, 0, 0.2, 1) infinite;
169
170
  --animate-spin-slow: spin 3s linear infinite;
171
+ --animate-kanban-card-flash: kanban-card-flash 0.7s ease-out;
170
172
  }
171
173
  }
172
174
  @layer base {
@@ -385,6 +387,9 @@
385
387
  .inset-y-0 {
386
388
  inset-block: 0;
387
389
  }
390
+ .-top-1\.5 {
391
+ top: calc(var(--spacing) * -1.5);
392
+ }
388
393
  .-top-2 {
389
394
  top: calc(var(--spacing) * -2);
390
395
  }
@@ -463,6 +468,9 @@
463
468
  .right-gdt-sm {
464
469
  right: var(--spacing-gdt-sm);
465
470
  }
471
+ .-bottom-1\.5 {
472
+ bottom: calc(var(--spacing) * -1.5);
473
+ }
466
474
  .-bottom-6 {
467
475
  bottom: calc(var(--spacing) * -6);
468
476
  }
@@ -817,6 +825,10 @@
817
825
  width: var(--switch-thumb-size);
818
826
  height: var(--switch-thumb-size);
819
827
  }
828
+ .size-1 {
829
+ width: var(--spacing);
830
+ height: var(--spacing);
831
+ }
820
832
  .size-1\.5 {
821
833
  width: calc(var(--spacing) * 1.5);
822
834
  height: calc(var(--spacing) * 1.5);
@@ -937,6 +949,9 @@
937
949
  .h-\(--collapsible-panel-height\) {
938
950
  height: var(--collapsible-panel-height);
939
951
  }
952
+ .h-\(--text-gdt-md--line-height\) {
953
+ height: var(--text-gdt-md--line-height);
954
+ }
940
955
  .h-0\.5 {
941
956
  height: calc(var(--spacing) * 0.5);
942
957
  }
@@ -1123,6 +1138,9 @@
1123
1138
  .min-h-32 {
1124
1139
  min-height: calc(var(--spacing) * 32);
1125
1140
  }
1141
+ .min-h-44 {
1142
+ min-height: calc(var(--spacing) * 44);
1143
+ }
1126
1144
  .min-h-48 {
1127
1145
  min-height: calc(var(--spacing) * 48);
1128
1146
  }
@@ -1240,12 +1258,12 @@
1240
1258
  .w-48 {
1241
1259
  width: calc(var(--spacing) * 48);
1242
1260
  }
1243
- .w-60 {
1244
- width: calc(var(--spacing) * 60);
1245
- }
1246
1261
  .w-65 {
1247
1262
  width: calc(var(--spacing) * 65);
1248
1263
  }
1264
+ .w-70 {
1265
+ width: calc(var(--spacing) * 70);
1266
+ }
1249
1267
  .w-72 {
1250
1268
  width: calc(var(--spacing) * 72);
1251
1269
  }
@@ -1303,6 +1321,9 @@
1303
1321
  .w-full {
1304
1322
  width: 100%;
1305
1323
  }
1324
+ .w-max {
1325
+ width: max-content;
1326
+ }
1306
1327
  .w-px {
1307
1328
  width: 1px;
1308
1329
  }
@@ -1318,9 +1339,6 @@
1318
1339
  .max-w-7xl {
1319
1340
  max-width: var(--container-7xl);
1320
1341
  }
1321
- .max-w-32 {
1322
- max-width: calc(var(--spacing) * 32);
1323
- }
1324
1342
  .max-w-40 {
1325
1343
  max-width: calc(var(--spacing) * 40);
1326
1344
  }
@@ -1375,9 +1393,18 @@
1375
1393
  .max-w-\[calc\(100vw-2rem\)\] {
1376
1394
  max-width: calc(100vw - 2rem);
1377
1395
  }
1396
+ .max-w-\[min\(20rem\,calc\(100vw-2rem\)\)\] {
1397
+ max-width: min(20rem, calc(100vw - 2rem));
1398
+ }
1399
+ .max-w-\[min\(22rem\,calc\(100vw-2rem\)\)\] {
1400
+ max-width: min(22rem, calc(100vw - 2rem));
1401
+ }
1378
1402
  .max-w-full {
1379
1403
  max-width: 100%;
1380
1404
  }
1405
+ .max-w-md {
1406
+ max-width: var(--container-md);
1407
+ }
1381
1408
  .max-w-none {
1382
1409
  max-width: none;
1383
1410
  }
@@ -1450,6 +1477,9 @@
1450
1477
  .min-w-56 {
1451
1478
  min-width: calc(var(--spacing) * 56);
1452
1479
  }
1480
+ .min-w-60 {
1481
+ min-width: calc(var(--spacing) * 60);
1482
+ }
1453
1483
  .min-w-\[calc\(var\(--anchor-width\)\)\] {
1454
1484
  min-width: calc(var(--anchor-width));
1455
1485
  }
@@ -1618,6 +1648,9 @@
1618
1648
  .cursor-default {
1619
1649
  cursor: default;
1620
1650
  }
1651
+ .cursor-grab {
1652
+ cursor: grab;
1653
+ }
1621
1654
  .cursor-not-allowed {
1622
1655
  cursor: not-allowed;
1623
1656
  }
@@ -4594,10 +4627,10 @@
4594
4627
  justify-content: flex-start;
4595
4628
  }
4596
4629
  }
4597
- .group-data-\[orientation\=vertical\]\/tabs\:border-l {
4630
+ .group-data-\[orientation\=vertical\]\/tabs\:border-r {
4598
4631
  &:is(:where(.group\/tabs)[data-orientation="vertical"] *) {
4599
- border-left-style: var(--tw-border-style);
4600
- border-left-width: 1px;
4632
+ border-right-style: var(--tw-border-style);
4633
+ border-right-width: 1px;
4601
4634
  }
4602
4635
  }
4603
4636
  .group-data-\[orientation\=vertical\]\/tabs\:border-line-subtle {
@@ -5866,11 +5899,6 @@
5866
5899
  background-color: var(--color-surface);
5867
5900
  }
5868
5901
  }
5869
- .group-data-\[variant\=underline\]\/tabs-list\:-mb-px {
5870
- &:is(:where(.group\/tabs-list)[data-variant="underline"] *) {
5871
- margin-bottom: -1px;
5872
- }
5873
- }
5874
5902
  .group-data-\[variant\=underline\]\/tabs-list\:rounded-none {
5875
5903
  &:is(:where(.group\/tabs-list)[data-variant="underline"] *) {
5876
5904
  border-radius: 0;
@@ -5925,6 +5953,13 @@
5925
5953
  }
5926
5954
  }
5927
5955
  }
5956
+ .group-data-\[orientation\=horizontal\]\/tabs\:group-data-\[variant\=underline\]\/tabs-list\:-mb-px {
5957
+ &:is(:where(.group\/tabs)[data-orientation="horizontal"] *) {
5958
+ &:is(:where(.group\/tabs-list)[data-variant="underline"] *) {
5959
+ margin-bottom: -1px;
5960
+ }
5961
+ }
5962
+ }
5928
5963
  .group-data-\[orientation\=horizontal\]\/tabs\:group-data-\[variant\=underline\]\/tabs-list\:h-0\.5\! {
5929
5964
  &:is(:where(.group\/tabs)[data-orientation="horizontal"] *) {
5930
5965
  &:is(:where(.group\/tabs-list)[data-variant="underline"] *) {
@@ -5954,6 +5989,13 @@
5954
5989
  }
5955
5990
  }
5956
5991
  }
5992
+ .group-data-\[orientation\=vertical\]\/tabs\:group-data-\[variant\=underline\]\/tabs-list\:-mr-px {
5993
+ &:is(:where(.group\/tabs)[data-orientation="vertical"] *) {
5994
+ &:is(:where(.group\/tabs-list)[data-variant="underline"] *) {
5995
+ margin-right: -1px;
5996
+ }
5997
+ }
5998
+ }
5957
5999
  .group-data-\[orientation\=vertical\]\/tabs\:group-data-\[variant\=underline\]\/tabs-list\:w-0\.5\! {
5958
6000
  &:is(:where(.group\/tabs)[data-orientation="vertical"] *) {
5959
6001
  &:is(:where(.group\/tabs-list)[data-variant="underline"] *) {
@@ -6962,6 +7004,11 @@
6962
7004
  scale: 0.99;
6963
7005
  }
6964
7006
  }
7007
+ .active\:cursor-grabbing {
7008
+ &:active {
7009
+ cursor: grabbing;
7010
+ }
7011
+ }
6965
7012
  .active\:border-line-strong {
6966
7013
  &:active {
6967
7014
  border-color: var(--color-line-strong);
@@ -7218,21 +7265,6 @@
7218
7265
  cursor: not-allowed;
7219
7266
  }
7220
7267
  }
7221
- .has-disabled\:border-line-subtle {
7222
- &:has(*:disabled) {
7223
- border-color: var(--color-line-subtle);
7224
- }
7225
- }
7226
- .has-disabled\:bg-surface {
7227
- &:has(*:disabled) {
7228
- background-color: var(--color-surface);
7229
- }
7230
- }
7231
- .has-disabled\:text-fg-caption-placeholder {
7232
- &:has(*:disabled) {
7233
- color: var(--color-fg-caption-placeholder);
7234
- }
7235
- }
7236
7268
  .has-disabled\:opacity-50 {
7237
7269
  &:has(*:disabled) {
7238
7270
  opacity: 50%;
@@ -7441,6 +7473,51 @@
7441
7473
  box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
7442
7474
  }
7443
7475
  }
7476
+ .has-\[\[data-slot\=input-group-control\]\:disabled\]\:border-line-subtle {
7477
+ &:has(*:is([data-slot=input-group-control]:disabled)) {
7478
+ border-color: var(--color-line-subtle);
7479
+ }
7480
+ }
7481
+ .has-\[\[data-slot\=input-group-control\]\:disabled\]\:bg-surface {
7482
+ &:has(*:is([data-slot=input-group-control]:disabled)) {
7483
+ background-color: var(--color-surface);
7484
+ }
7485
+ }
7486
+ .has-\[\[data-slot\=input-group-control\]\:disabled\]\:text-fg-caption-placeholder {
7487
+ &:has(*:is([data-slot=input-group-control]:disabled)) {
7488
+ color: var(--color-fg-caption-placeholder);
7489
+ }
7490
+ }
7491
+ .group-data-\[orientation\=horizontal\]\/tabs\:has-\[\[data-slot\=scroll-spy-list\]\[data-variant\=underline\]\]\:border-b {
7492
+ &:is(:where(.group\/tabs)[data-orientation="horizontal"] *) {
7493
+ &:has(*:is([data-slot=scroll-spy-list][data-variant=underline])) {
7494
+ border-bottom-style: var(--tw-border-style);
7495
+ border-bottom-width: 1px;
7496
+ }
7497
+ }
7498
+ }
7499
+ .group-data-\[orientation\=horizontal\]\/tabs\:has-\[\[data-slot\=scroll-spy-list\]\[data-variant\=underline\]\]\:border-line-subtle {
7500
+ &:is(:where(.group\/tabs)[data-orientation="horizontal"] *) {
7501
+ &:has(*:is([data-slot=scroll-spy-list][data-variant=underline])) {
7502
+ border-color: var(--color-line-subtle);
7503
+ }
7504
+ }
7505
+ }
7506
+ .group-data-\[orientation\=vertical\]\/tabs\:has-\[\[data-slot\=scroll-spy-list\]\[data-variant\=underline\]\]\:border-r {
7507
+ &:is(:where(.group\/tabs)[data-orientation="vertical"] *) {
7508
+ &:has(*:is([data-slot=scroll-spy-list][data-variant=underline])) {
7509
+ border-right-style: var(--tw-border-style);
7510
+ border-right-width: 1px;
7511
+ }
7512
+ }
7513
+ }
7514
+ .group-data-\[orientation\=vertical\]\/tabs\:has-\[\[data-slot\=scroll-spy-list\]\[data-variant\=underline\]\]\:border-line-subtle {
7515
+ &:is(:where(.group\/tabs)[data-orientation="vertical"] *) {
7516
+ &:has(*:is([data-slot=scroll-spy-list][data-variant=underline])) {
7517
+ border-color: var(--color-line-subtle);
7518
+ }
7519
+ }
7520
+ }
7444
7521
  .has-\[\[data-slot\=table-card-action\]\]\:cursor-pointer {
7445
7522
  &:has(*:is([data-slot=table-card-action])) {
7446
7523
  cursor: pointer;
@@ -7462,6 +7539,42 @@
7462
7539
  --tw-inset-ring-color: var(--color-line-focus);
7463
7540
  }
7464
7541
  }
7542
+ .has-\[\[data-slot\=tabs-list\]\[data-variant\=underline\]\]\:border-b {
7543
+ &:has(*:is([data-slot=tabs-list][data-variant=underline])) {
7544
+ border-bottom-style: var(--tw-border-style);
7545
+ border-bottom-width: 1px;
7546
+ }
7547
+ }
7548
+ .group-data-\[orientation\=horizontal\]\/tabs\:has-\[\[data-slot\=tabs-list\]\[data-variant\=underline\]\]\:border-b {
7549
+ &:is(:where(.group\/tabs)[data-orientation="horizontal"] *) {
7550
+ &:has(*:is([data-slot=tabs-list][data-variant=underline])) {
7551
+ border-bottom-style: var(--tw-border-style);
7552
+ border-bottom-width: 1px;
7553
+ }
7554
+ }
7555
+ }
7556
+ .group-data-\[orientation\=horizontal\]\/tabs\:has-\[\[data-slot\=tabs-list\]\[data-variant\=underline\]\]\:border-line-subtle {
7557
+ &:is(:where(.group\/tabs)[data-orientation="horizontal"] *) {
7558
+ &:has(*:is([data-slot=tabs-list][data-variant=underline])) {
7559
+ border-color: var(--color-line-subtle);
7560
+ }
7561
+ }
7562
+ }
7563
+ .group-data-\[orientation\=vertical\]\/tabs\:has-\[\[data-slot\=tabs-list\]\[data-variant\=underline\]\]\:border-r {
7564
+ &:is(:where(.group\/tabs)[data-orientation="vertical"] *) {
7565
+ &:has(*:is([data-slot=tabs-list][data-variant=underline])) {
7566
+ border-right-style: var(--tw-border-style);
7567
+ border-right-width: 1px;
7568
+ }
7569
+ }
7570
+ }
7571
+ .group-data-\[orientation\=vertical\]\/tabs\:has-\[\[data-slot\=tabs-list\]\[data-variant\=underline\]\]\:border-line-subtle {
7572
+ &:is(:where(.group\/tabs)[data-orientation="vertical"] *) {
7573
+ &:has(*:is([data-slot=tabs-list][data-variant=underline])) {
7574
+ border-color: var(--color-line-subtle);
7575
+ }
7576
+ }
7577
+ }
7465
7578
  .has-\[\[data-slot\]\[aria-invalid\=true\]\]\:border-line-danger {
7466
7579
  &:has(*:is([data-slot][aria-invalid=true])) {
7467
7580
  border-color: var(--color-line-danger);
@@ -7926,6 +8039,16 @@
7926
8039
  }
7927
8040
  }
7928
8041
  }
8042
+ .data-dragging\:opacity-40 {
8043
+ &[data-dragging] {
8044
+ opacity: 40%;
8045
+ }
8046
+ }
8047
+ .data-drop-target\:border-line-strong {
8048
+ &[data-drop-target] {
8049
+ border-color: var(--color-line-strong);
8050
+ }
8051
+ }
7929
8052
  .data-empty\:p-0 {
7930
8053
  &[data-empty] {
7931
8054
  padding: 0;
@@ -8103,6 +8226,11 @@
8103
8226
  }
8104
8227
  }
8105
8228
  }
8229
+ .data-just-moved\:animate-kanban-card-flash {
8230
+ &[data-just-moved] {
8231
+ animation: var(--animate-kanban-card-flash);
8232
+ }
8233
+ }
8106
8234
  .data-loading\:animate-pulse {
8107
8235
  &[data-loading] {
8108
8236
  animation: var(--animate-pulse);
@@ -9825,6 +9953,11 @@
9825
9953
  backdrop-filter: var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);
9826
9954
  }
9827
9955
  }
9956
+ .motion-safe\:scroll-smooth {
9957
+ @media (prefers-reduced-motion: no-preference) {
9958
+ scroll-behavior: smooth;
9959
+ }
9960
+ }
9828
9961
  .motion-reduce\:hidden {
9829
9962
  @media (prefers-reduced-motion: reduce) {
9830
9963
  display: none;
@@ -14162,6 +14295,14 @@
14162
14295
  opacity: 0;
14163
14296
  }
14164
14297
  }
14298
+ @keyframes kanban-card-flash {
14299
+ 0%, 40% {
14300
+ box-shadow: 0 0 0 2px var(--color-line-focus);
14301
+ }
14302
+ 100% {
14303
+ box-shadow: 0 0 0 2px transparent;
14304
+ }
14305
+ }
14165
14306
  @layer base {
14166
14307
  body {
14167
14308
  display: flex;
package/dist/tabs.d.ts CHANGED
@@ -8,6 +8,36 @@ type TabsListVariant = "default" | "line" | "secondary" | "underline";
8
8
  * looks the design system ships: `underline` (Primary) and `secondary` (Pill).
9
9
  */
10
10
  declare function resolveTabsListVariant(variant: TabsListVariant): "secondary" | "underline";
11
+ /**
12
+ * Marks that a `TabsListContainer` (or `ScrollSpyListContainer`) is above us,
13
+ * so the list knows to hand the baseline rule over instead of drawing it
14
+ * itself. Exported for `scroll-spy.tsx`, which shares the whole bar.
15
+ */
16
+ declare const TabsListContainerContext: import("react").Context<boolean>;
17
+ declare function useInTabsListContainer(): boolean;
18
+ /**
19
+ * Layout shared by `TabsListContainer` and `ScrollSpyListContainer`. Kept
20
+ * separate from the rule below because the two match their own list's slot.
21
+ */
22
+ declare const tabsListContainerBaseClassName: string;
23
+ /**
24
+ * Container styling. Owns the baseline rule the list used to draw for itself,
25
+ * so padding put on the container insets the tabs while the line still runs
26
+ * the container's full width — and so overflow controls can sit beside the
27
+ * list without the rule stopping short of them.
28
+ *
29
+ * The rule keys off the list's own `data-variant` rather than a prop of its
30
+ * own, so `variant` stays in one place (`TabsList`) and a pill list can never
31
+ * leave a stray line behind it.
32
+ */
33
+ declare const tabsListContainerClassName: string;
34
+ /**
35
+ * Optional wrapper around `TabsList`. Use it when the bar needs padding the
36
+ * tabs shouldn't inherit — a full-bleed rule under an inset row of tabs — or
37
+ * when something other than a tab has to sit in the bar. Without it `TabsList`
38
+ * keeps drawing its own rule, so existing markup is unaffected.
39
+ */
40
+ declare function TabsListContainer({ className, children, ...props }: ComponentPropsWithoutRef<"div">): import("react").JSX.Element;
11
41
  declare function Tabs({ className, orientation, size, ...props }: Tabs$1.Root.Props & {
12
42
  /**
13
43
  * @deprecated Pass `size` to `TabsList` instead — the root is
@@ -18,6 +48,7 @@ declare function Tabs({ className, orientation, size, ...props }: Tabs$1.Root.Pr
18
48
  }): import("react").JSX.Element;
19
49
  declare const tabsListVariants: (props?: ({
20
50
  variant?: "secondary" | "underline" | null | undefined;
51
+ standalone?: boolean | null | undefined;
21
52
  } & import("class-variance-authority/types").ClassProp) | undefined) => string;
22
53
  declare function TabsList({ className, variant, size, children, ...props }: Tabs$1.List.Props & {
23
54
  variant?: TabsListVariant;
@@ -47,8 +78,13 @@ type TabsCountProps = ComponentPropsWithoutRef<"span"> & {
47
78
  max?: number;
48
79
  /** Render a pulsing placeholder while the count is being fetched. */
49
80
  loading?: boolean;
81
+ /**
82
+ * Slot name, so `ScrollSpyCount` can keep the spy's own naming while sharing
83
+ * this implementation. Not something consuming apps need to set.
84
+ */
85
+ "data-slot"?: string;
50
86
  };
51
- declare function TabsCount({ className, count, abbreviate, max, loading, children, ...props }: TabsCountProps): import("react").JSX.Element;
87
+ declare function TabsCount({ className, count, abbreviate, max, loading, children, "data-slot": dataSlot, ...props }: TabsCountProps): import("react").JSX.Element;
52
88
  declare function TabsContent({ className, ...props }: Tabs$1.Panel.Props): import("react").JSX.Element;
53
89
  //#endregion
54
- export { Tabs, TabsContent, TabsCount, TabsList, type TabsListVariant, TabsTrigger, resolveTabsListVariant, tabsIndicatorClassName, tabsListVariants, tabsTriggerClassName };
90
+ export { Tabs, TabsContent, TabsCount, type TabsCountProps, TabsList, TabsListContainer, TabsListContainerContext, type TabsListVariant, TabsTrigger, resolveTabsListVariant, tabsIndicatorClassName, tabsListContainerBaseClassName, tabsListContainerClassName, tabsListVariants, tabsTriggerClassName, useInTabsListContainer };
package/dist/tabs.js CHANGED
@@ -3,6 +3,7 @@ import { cn } from "./utils/cn.js";
3
3
  import { SizeProvider, useComponentSize } from "./size-context.js";
4
4
  import { jsx, jsxs } from "react/jsx-runtime";
5
5
  import { cva } from "class-variance-authority";
6
+ import { createContext, useContext } from "react";
6
7
  import { Tabs as Tabs$1 } from "@base-ui/react/tabs";
7
8
  //#region src/tabs.tsx
8
9
  /**
@@ -12,6 +13,48 @@ import { Tabs as Tabs$1 } from "@base-ui/react/tabs";
12
13
  function resolveTabsListVariant(variant) {
13
14
  return variant === "default" ? "secondary" : variant === "line" ? "underline" : variant;
14
15
  }
16
+ /**
17
+ * Marks that a `TabsListContainer` (or `ScrollSpyListContainer`) is above us,
18
+ * so the list knows to hand the baseline rule over instead of drawing it
19
+ * itself. Exported for `scroll-spy.tsx`, which shares the whole bar.
20
+ */
21
+ const TabsListContainerContext = createContext(false);
22
+ function useInTabsListContainer() {
23
+ return useContext(TabsListContainerContext);
24
+ }
25
+ /**
26
+ * Layout shared by `TabsListContainer` and `ScrollSpyListContainer`. Kept
27
+ * separate from the rule below because the two match their own list's slot.
28
+ */
29
+ const tabsListContainerBaseClassName = cn("group/tabs-list-container relative flex min-w-0 items-stretch", "group-data-[orientation=vertical]/tabs:flex-col");
30
+ /**
31
+ * Container styling. Owns the baseline rule the list used to draw for itself,
32
+ * so padding put on the container insets the tabs while the line still runs
33
+ * the container's full width — and so overflow controls can sit beside the
34
+ * list without the rule stopping short of them.
35
+ *
36
+ * The rule keys off the list's own `data-variant` rather than a prop of its
37
+ * own, so `variant` stays in one place (`TabsList`) and a pill list can never
38
+ * leave a stray line behind it.
39
+ */
40
+ const tabsListContainerClassName = cn(tabsListContainerBaseClassName, "group-data-[orientation=horizontal]/tabs:has-[[data-slot=tabs-list][data-variant=underline]]:border-b group-data-[orientation=horizontal]/tabs:has-[[data-slot=tabs-list][data-variant=underline]]:border-line-subtle", "group-data-[orientation=vertical]/tabs:has-[[data-slot=tabs-list][data-variant=underline]]:border-r group-data-[orientation=vertical]/tabs:has-[[data-slot=tabs-list][data-variant=underline]]:border-line-subtle");
41
+ /**
42
+ * Optional wrapper around `TabsList`. Use it when the bar needs padding the
43
+ * tabs shouldn't inherit — a full-bleed rule under an inset row of tabs — or
44
+ * when something other than a tab has to sit in the bar. Without it `TabsList`
45
+ * keeps drawing its own rule, so existing markup is unaffected.
46
+ */
47
+ function TabsListContainer({ className, children, ...props }) {
48
+ return /* @__PURE__ */ jsx(TabsListContainerContext.Provider, {
49
+ value: true,
50
+ children: /* @__PURE__ */ jsx("div", {
51
+ "data-slot": "tabs-list-container",
52
+ className: cn(tabsListContainerClassName, className),
53
+ ...props,
54
+ children
55
+ })
56
+ });
57
+ }
15
58
  function Tabs({ className, orientation = "horizontal", size, ...props }) {
16
59
  const root = /* @__PURE__ */ jsx(Tabs$1.Root, {
17
60
  "data-slot": "tabs",
@@ -25,20 +68,43 @@ function Tabs({ className, orientation = "horizontal", size, ...props }) {
25
68
  }) : root;
26
69
  }
27
70
  const tabsListVariants = cva(cn("group/tabs-list relative inline-flex w-fit shrink-0 items-center gap-1 text-fg-secondary", "group-data-[orientation=vertical]/tabs:flex-col"), {
28
- variants: { variant: {
29
- underline: cn("rounded-none bg-transparent p-0", "group-data-[orientation=horizontal]/tabs:border-b group-data-[orientation=horizontal]/tabs:border-line-subtle", "group-data-[orientation=vertical]/tabs:border-l group-data-[orientation=vertical]/tabs:border-line-subtle"),
30
- secondary: "rounded-4xl bg-transparent p-0"
31
- } },
32
- defaultVariants: { variant: "underline" }
71
+ variants: {
72
+ variant: {
73
+ underline: "rounded-none bg-transparent p-0",
74
+ secondary: "rounded-4xl bg-transparent p-0"
75
+ },
76
+ /**
77
+ * The baseline rule belongs to `TabsListContainer` when there is one,
78
+ * so it can span padding the tabs don't sit in. A list on its own is
79
+ * still the bar, and draws the rule itself.
80
+ */
81
+ standalone: {
82
+ true: "",
83
+ false: ""
84
+ }
85
+ },
86
+ compoundVariants: [{
87
+ variant: "underline",
88
+ standalone: true,
89
+ class: cn("group-data-[orientation=horizontal]/tabs:border-b group-data-[orientation=horizontal]/tabs:border-line-subtle", "group-data-[orientation=vertical]/tabs:border-r group-data-[orientation=vertical]/tabs:border-line-subtle")
90
+ }],
91
+ defaultVariants: {
92
+ variant: "underline",
93
+ standalone: true
94
+ }
33
95
  });
34
96
  function TabsList({ className, variant = "underline", size, children, ...props }) {
35
97
  const resolvedVariant = resolveTabsListVariant(variant);
36
98
  const resolvedSize = useComponentSize(size);
99
+ const inContainer = useInTabsListContainer();
37
100
  return /* @__PURE__ */ jsxs(Tabs$1.List, {
38
101
  "data-slot": "tabs-list",
39
102
  "data-variant": resolvedVariant,
40
103
  "data-size": resolvedSize,
41
- className: cn(tabsListVariants({ variant: resolvedVariant }), className),
104
+ className: cn(tabsListVariants({
105
+ variant: resolvedVariant,
106
+ standalone: !inContainer
107
+ }), className),
42
108
  ...props,
43
109
  children: [children, /* @__PURE__ */ jsx(Tabs$1.Indicator, { className: tabsIndicatorClassName })]
44
110
  });
@@ -56,7 +122,7 @@ const tabsIndicatorClassName = cn("pointer-events-none absolute left-0 top-0 z-0
56
122
  * off the parent `group/tabs-list`, so it stays in sync wherever it lives
57
123
  * inside a `Tabs` tree.
58
124
  */
59
- const tabsTriggerClassName = cn("group/tabs-trigger relative inline-flex shrink-0 items-center justify-center gap-2 whitespace-nowrap border border-transparent font-semibold outline-none transition-[background-color,color,box-shadow]", "focus-visible:shadow-[0px_0px_0px_2px_var(--color-line-focus)]", "disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50", "group-data-[orientation=vertical]/tabs:w-full group-data-[orientation=vertical]/tabs:justify-start", "[&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg]:text-current", "group-data-[size=sm]/tabs-list:text-gdt-xs group-data-[size=sm]/tabs-list:[&_svg:not([class*='size-'])]:size-3.5", "group-data-[size=md]/tabs-list:text-gdt-sm group-data-[size=md]/tabs-list:[&_svg:not([class*='size-'])]:size-4", "group-data-[size=lg]/tabs-list:text-gdt-md group-data-[size=lg]/tabs-list:[&_svg:not([class*='size-'])]:size-4.5", "group-data-[variant=underline]/tabs-list:group-data-[size=sm]/tabs-list:px-3 group-data-[variant=underline]/tabs-list:group-data-[size=sm]/tabs-list:py-1", "group-data-[variant=underline]/tabs-list:group-data-[size=md]/tabs-list:px-3.5 group-data-[variant=underline]/tabs-list:group-data-[size=md]/tabs-list:py-1.5", "group-data-[variant=underline]/tabs-list:group-data-[size=lg]/tabs-list:px-4 group-data-[variant=underline]/tabs-list:group-data-[size=lg]/tabs-list:py-1.5", "group-data-[variant=secondary]/tabs-list:group-data-[size=sm]/tabs-list:px-3 group-data-[variant=secondary]/tabs-list:group-data-[size=sm]/tabs-list:py-1", "group-data-[variant=secondary]/tabs-list:group-data-[size=md]/tabs-list:px-3.5 group-data-[variant=secondary]/tabs-list:group-data-[size=md]/tabs-list:py-1.5", "group-data-[variant=secondary]/tabs-list:group-data-[size=lg]/tabs-list:px-4 group-data-[variant=secondary]/tabs-list:group-data-[size=lg]/tabs-list:py-2", "group-data-[variant=underline]/tabs-list:-mb-px group-data-[variant=underline]/tabs-list:rounded-none group-data-[variant=underline]/tabs-list:text-fg-secondary group-data-[variant=underline]/tabs-list:hover:text-fg-primary group-data-[variant=underline]/tabs-list:data-active:text-fg-primary", "group-data-[variant=secondary]/tabs-list:rounded-4xl group-data-[variant=secondary]/tabs-list:bg-surface-raised group-data-[variant=secondary]/tabs-list:text-fg-secondary group-data-[variant=secondary]/tabs-list:hover:bg-surface group-data-[variant=secondary]/tabs-list:hover:text-fg-primary group-data-[variant=secondary]/tabs-list:data-active:bg-surface-brand group-data-[variant=secondary]/tabs-list:data-active:text-fg-on-brand group-data-[variant=secondary]/tabs-list:data-active:shadow-(--elevation-e1-shadow) group-data-[variant=secondary]/tabs-list:data-active:hover:bg-surface-brand group-data-[variant=secondary]/tabs-list:data-active:hover:text-fg-on-brand");
125
+ const tabsTriggerClassName = cn("group/tabs-trigger relative inline-flex shrink-0 items-center justify-center gap-2 whitespace-nowrap border border-transparent font-semibold outline-none transition-[background-color,color,box-shadow]", "focus-visible:shadow-[0px_0px_0px_2px_var(--color-line-focus)]", "disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50", "group-data-[orientation=vertical]/tabs:w-full group-data-[orientation=vertical]/tabs:justify-start", "[&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg]:text-current", "group-data-[size=sm]/tabs-list:text-gdt-xs group-data-[size=sm]/tabs-list:[&_svg:not([class*='size-'])]:size-3.5", "group-data-[size=md]/tabs-list:text-gdt-sm group-data-[size=md]/tabs-list:[&_svg:not([class*='size-'])]:size-4", "group-data-[size=lg]/tabs-list:text-gdt-md group-data-[size=lg]/tabs-list:[&_svg:not([class*='size-'])]:size-4.5", "group-data-[variant=underline]/tabs-list:group-data-[size=sm]/tabs-list:px-3 group-data-[variant=underline]/tabs-list:group-data-[size=sm]/tabs-list:py-1", "group-data-[variant=underline]/tabs-list:group-data-[size=md]/tabs-list:px-3.5 group-data-[variant=underline]/tabs-list:group-data-[size=md]/tabs-list:py-1.5", "group-data-[variant=underline]/tabs-list:group-data-[size=lg]/tabs-list:px-4 group-data-[variant=underline]/tabs-list:group-data-[size=lg]/tabs-list:py-1.5", "group-data-[variant=secondary]/tabs-list:group-data-[size=sm]/tabs-list:px-3 group-data-[variant=secondary]/tabs-list:group-data-[size=sm]/tabs-list:py-1", "group-data-[variant=secondary]/tabs-list:group-data-[size=md]/tabs-list:px-3.5 group-data-[variant=secondary]/tabs-list:group-data-[size=md]/tabs-list:py-1.5", "group-data-[variant=secondary]/tabs-list:group-data-[size=lg]/tabs-list:px-4 group-data-[variant=secondary]/tabs-list:group-data-[size=lg]/tabs-list:py-2", "group-data-[orientation=horizontal]/tabs:group-data-[variant=underline]/tabs-list:-mb-px group-data-[orientation=vertical]/tabs:group-data-[variant=underline]/tabs-list:-mr-px group-data-[variant=underline]/tabs-list:rounded-none group-data-[variant=underline]/tabs-list:text-fg-secondary group-data-[variant=underline]/tabs-list:hover:text-fg-primary group-data-[variant=underline]/tabs-list:data-active:text-fg-primary", "group-data-[variant=secondary]/tabs-list:rounded-4xl group-data-[variant=secondary]/tabs-list:bg-surface-raised group-data-[variant=secondary]/tabs-list:text-fg-secondary group-data-[variant=secondary]/tabs-list:hover:bg-surface group-data-[variant=secondary]/tabs-list:hover:text-fg-primary group-data-[variant=secondary]/tabs-list:data-active:bg-surface-brand group-data-[variant=secondary]/tabs-list:data-active:text-fg-on-brand group-data-[variant=secondary]/tabs-list:data-active:shadow-(--elevation-e1-shadow) group-data-[variant=secondary]/tabs-list:data-active:hover:bg-surface-brand group-data-[variant=secondary]/tabs-list:data-active:hover:text-fg-on-brand");
60
126
  function TabsTrigger({ className, nativeButton = true, ...props }) {
61
127
  return /* @__PURE__ */ jsx(Tabs$1.Tab, {
62
128
  "data-slot": "tabs-trigger",
@@ -93,7 +159,7 @@ function formatTabsCount(value, { abbreviate, max }) {
93
159
  if (max !== void 0 && value > max) return `${abbreviate ? abbreviateCount(max) : max}+`;
94
160
  return abbreviate ? abbreviateCount(value) : String(value);
95
161
  }
96
- function TabsCount({ className, count, abbreviate, max, loading, children, ...props }) {
162
+ function TabsCount({ className, count, abbreviate, max, loading, children, "data-slot": dataSlot = "tabs-count", ...props }) {
97
163
  const content = loading ? /* @__PURE__ */ jsx("span", {
98
164
  "aria-hidden": true,
99
165
  className: "invisible",
@@ -103,7 +169,7 @@ function TabsCount({ className, count, abbreviate, max, loading, children, ...pr
103
169
  max
104
170
  }) : children;
105
171
  return /* @__PURE__ */ jsx("span", {
106
- "data-slot": "tabs-count",
172
+ "data-slot": dataSlot,
107
173
  "data-loading": loading || void 0,
108
174
  "aria-busy": loading || void 0,
109
175
  className: cn("inline-flex items-center justify-center rounded-full font-semibold leading-none transition-[background-color,color]", "group-data-[size=sm]/tabs-list:h-4 group-data-[size=sm]/tabs-list:min-w-4 group-data-[size=sm]/tabs-list:px-1 group-data-[size=sm]/tabs-list:text-[10px]", "group-data-[size=md]/tabs-list:h-5 group-data-[size=md]/tabs-list:min-w-5 group-data-[size=md]/tabs-list:px-1 group-data-[size=md]/tabs-list:text-[11px]", "group-data-[size=lg]/tabs-list:h-5 group-data-[size=lg]/tabs-list:min-w-5 group-data-[size=lg]/tabs-list:px-1.5 group-data-[size=lg]/tabs-list:text-gdt-xs", "group-data-[variant=underline]/tabs-list:bg-surface-raised group-data-[variant=underline]/tabs-list:text-fg-secondary group-data-[variant=underline]/tabs-list:group-data-[active]/tabs-trigger:bg-surface-brand-subtle group-data-[variant=underline]/tabs-list:group-data-[active]/tabs-trigger:text-fg-brand", "group-data-[variant=secondary]/tabs-list:bg-surface-overlay group-data-[variant=secondary]/tabs-list:text-fg-secondary group-data-[variant=secondary]/tabs-list:group-data-[active]/tabs-trigger:bg-surface-brand-subtle group-data-[variant=secondary]/tabs-list:group-data-[active]/tabs-trigger:text-fg-brand", "data-loading:animate-pulse motion-reduce:data-loading:animate-none", className),
@@ -119,4 +185,4 @@ function TabsContent({ className, ...props }) {
119
185
  });
120
186
  }
121
187
  //#endregion
122
- export { Tabs, TabsContent, TabsCount, TabsList, TabsTrigger, resolveTabsListVariant, tabsIndicatorClassName, tabsListVariants, tabsTriggerClassName };
188
+ export { Tabs, TabsContent, TabsCount, TabsList, TabsListContainer, TabsListContainerContext, TabsTrigger, resolveTabsListVariant, tabsIndicatorClassName, tabsListContainerBaseClassName, tabsListContainerClassName, tabsListVariants, tabsTriggerClassName, useInTabsListContainer };
@@ -1,5 +1,5 @@
1
1
  import { InputSizeValue } from "./input.js";
2
- import { t as PickerPlacementProps } from "./picker-qxWi9wZ1.js";
2
+ import { t as PickerPlacementProps } from "./picker-QtFHPRqg.js";
3
3
  import * as React from "react";
4
4
  //#region src/time-picker.d.ts
5
5
  interface TimePickerProps extends PickerPlacementProps {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@giddaa-housing/ui",
3
- "version": "3.9.0",
3
+ "version": "3.10.0",
4
4
  "description": "Giddaa reusable UI component library.",
5
5
  "type": "module",
6
6
  "private": false,
@@ -205,6 +205,10 @@
205
205
  "types": "./dist/item.d.ts",
206
206
  "import": "./dist/item.js"
207
207
  },
208
+ "./kanban": {
209
+ "types": "./dist/kanban.d.ts",
210
+ "import": "./dist/kanban.js"
211
+ },
208
212
  "./kpi-card": {
209
213
  "types": "./dist/kpi-card.d.ts",
210
214
  "import": "./dist/kpi-card.js"
@@ -446,6 +450,9 @@
446
450
  "react-dom": ">=18.3.0 || >=19.0.0"
447
451
  },
448
452
  "dependencies": {
453
+ "@atlaskit/pragmatic-drag-and-drop": "^3.1.0",
454
+ "@atlaskit/pragmatic-drag-and-drop-auto-scroll": "^3.2.0",
455
+ "@atlaskit/pragmatic-drag-and-drop-hitbox": "^2.2.0",
449
456
  "@base-ui/react": "^1.5.0",
450
457
  "@tanstack/react-virtual": "^3.14.7",
451
458
  "@tiptap/extension-color": "^3.22.5",