@giddaa-housing/ui 3.9.1 → 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);
@@ -1126,6 +1138,9 @@
1126
1138
  .min-h-32 {
1127
1139
  min-height: calc(var(--spacing) * 32);
1128
1140
  }
1141
+ .min-h-44 {
1142
+ min-height: calc(var(--spacing) * 44);
1143
+ }
1129
1144
  .min-h-48 {
1130
1145
  min-height: calc(var(--spacing) * 48);
1131
1146
  }
@@ -1243,12 +1258,12 @@
1243
1258
  .w-48 {
1244
1259
  width: calc(var(--spacing) * 48);
1245
1260
  }
1246
- .w-60 {
1247
- width: calc(var(--spacing) * 60);
1248
- }
1249
1261
  .w-65 {
1250
1262
  width: calc(var(--spacing) * 65);
1251
1263
  }
1264
+ .w-70 {
1265
+ width: calc(var(--spacing) * 70);
1266
+ }
1252
1267
  .w-72 {
1253
1268
  width: calc(var(--spacing) * 72);
1254
1269
  }
@@ -1306,6 +1321,9 @@
1306
1321
  .w-full {
1307
1322
  width: 100%;
1308
1323
  }
1324
+ .w-max {
1325
+ width: max-content;
1326
+ }
1309
1327
  .w-px {
1310
1328
  width: 1px;
1311
1329
  }
@@ -1321,9 +1339,6 @@
1321
1339
  .max-w-7xl {
1322
1340
  max-width: var(--container-7xl);
1323
1341
  }
1324
- .max-w-32 {
1325
- max-width: calc(var(--spacing) * 32);
1326
- }
1327
1342
  .max-w-40 {
1328
1343
  max-width: calc(var(--spacing) * 40);
1329
1344
  }
@@ -1378,9 +1393,18 @@
1378
1393
  .max-w-\[calc\(100vw-2rem\)\] {
1379
1394
  max-width: calc(100vw - 2rem);
1380
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
+ }
1381
1402
  .max-w-full {
1382
1403
  max-width: 100%;
1383
1404
  }
1405
+ .max-w-md {
1406
+ max-width: var(--container-md);
1407
+ }
1384
1408
  .max-w-none {
1385
1409
  max-width: none;
1386
1410
  }
@@ -1453,6 +1477,9 @@
1453
1477
  .min-w-56 {
1454
1478
  min-width: calc(var(--spacing) * 56);
1455
1479
  }
1480
+ .min-w-60 {
1481
+ min-width: calc(var(--spacing) * 60);
1482
+ }
1456
1483
  .min-w-\[calc\(var\(--anchor-width\)\)\] {
1457
1484
  min-width: calc(var(--anchor-width));
1458
1485
  }
@@ -1621,6 +1648,9 @@
1621
1648
  .cursor-default {
1622
1649
  cursor: default;
1623
1650
  }
1651
+ .cursor-grab {
1652
+ cursor: grab;
1653
+ }
1624
1654
  .cursor-not-allowed {
1625
1655
  cursor: not-allowed;
1626
1656
  }
@@ -4597,10 +4627,10 @@
4597
4627
  justify-content: flex-start;
4598
4628
  }
4599
4629
  }
4600
- .group-data-\[orientation\=vertical\]\/tabs\:border-l {
4630
+ .group-data-\[orientation\=vertical\]\/tabs\:border-r {
4601
4631
  &:is(:where(.group\/tabs)[data-orientation="vertical"] *) {
4602
- border-left-style: var(--tw-border-style);
4603
- border-left-width: 1px;
4632
+ border-right-style: var(--tw-border-style);
4633
+ border-right-width: 1px;
4604
4634
  }
4605
4635
  }
4606
4636
  .group-data-\[orientation\=vertical\]\/tabs\:border-line-subtle {
@@ -5869,11 +5899,6 @@
5869
5899
  background-color: var(--color-surface);
5870
5900
  }
5871
5901
  }
5872
- .group-data-\[variant\=underline\]\/tabs-list\:-mb-px {
5873
- &:is(:where(.group\/tabs-list)[data-variant="underline"] *) {
5874
- margin-bottom: -1px;
5875
- }
5876
- }
5877
5902
  .group-data-\[variant\=underline\]\/tabs-list\:rounded-none {
5878
5903
  &:is(:where(.group\/tabs-list)[data-variant="underline"] *) {
5879
5904
  border-radius: 0;
@@ -5928,6 +5953,13 @@
5928
5953
  }
5929
5954
  }
5930
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
+ }
5931
5963
  .group-data-\[orientation\=horizontal\]\/tabs\:group-data-\[variant\=underline\]\/tabs-list\:h-0\.5\! {
5932
5964
  &:is(:where(.group\/tabs)[data-orientation="horizontal"] *) {
5933
5965
  &:is(:where(.group\/tabs-list)[data-variant="underline"] *) {
@@ -5957,6 +5989,13 @@
5957
5989
  }
5958
5990
  }
5959
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
+ }
5960
5999
  .group-data-\[orientation\=vertical\]\/tabs\:group-data-\[variant\=underline\]\/tabs-list\:w-0\.5\! {
5961
6000
  &:is(:where(.group\/tabs)[data-orientation="vertical"] *) {
5962
6001
  &:is(:where(.group\/tabs-list)[data-variant="underline"] *) {
@@ -6965,6 +7004,11 @@
6965
7004
  scale: 0.99;
6966
7005
  }
6967
7006
  }
7007
+ .active\:cursor-grabbing {
7008
+ &:active {
7009
+ cursor: grabbing;
7010
+ }
7011
+ }
6968
7012
  .active\:border-line-strong {
6969
7013
  &:active {
6970
7014
  border-color: var(--color-line-strong);
@@ -7221,21 +7265,6 @@
7221
7265
  cursor: not-allowed;
7222
7266
  }
7223
7267
  }
7224
- .has-disabled\:border-line-subtle {
7225
- &:has(*:disabled) {
7226
- border-color: var(--color-line-subtle);
7227
- }
7228
- }
7229
- .has-disabled\:bg-surface {
7230
- &:has(*:disabled) {
7231
- background-color: var(--color-surface);
7232
- }
7233
- }
7234
- .has-disabled\:text-fg-caption-placeholder {
7235
- &:has(*:disabled) {
7236
- color: var(--color-fg-caption-placeholder);
7237
- }
7238
- }
7239
7268
  .has-disabled\:opacity-50 {
7240
7269
  &:has(*:disabled) {
7241
7270
  opacity: 50%;
@@ -7444,6 +7473,51 @@
7444
7473
  box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
7445
7474
  }
7446
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
+ }
7447
7521
  .has-\[\[data-slot\=table-card-action\]\]\:cursor-pointer {
7448
7522
  &:has(*:is([data-slot=table-card-action])) {
7449
7523
  cursor: pointer;
@@ -7465,6 +7539,42 @@
7465
7539
  --tw-inset-ring-color: var(--color-line-focus);
7466
7540
  }
7467
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
+ }
7468
7578
  .has-\[\[data-slot\]\[aria-invalid\=true\]\]\:border-line-danger {
7469
7579
  &:has(*:is([data-slot][aria-invalid=true])) {
7470
7580
  border-color: var(--color-line-danger);
@@ -7929,6 +8039,16 @@
7929
8039
  }
7930
8040
  }
7931
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
+ }
7932
8052
  .data-empty\:p-0 {
7933
8053
  &[data-empty] {
7934
8054
  padding: 0;
@@ -8106,6 +8226,11 @@
8106
8226
  }
8107
8227
  }
8108
8228
  }
8229
+ .data-just-moved\:animate-kanban-card-flash {
8230
+ &[data-just-moved] {
8231
+ animation: var(--animate-kanban-card-flash);
8232
+ }
8233
+ }
8109
8234
  .data-loading\:animate-pulse {
8110
8235
  &[data-loading] {
8111
8236
  animation: var(--animate-pulse);
@@ -9828,6 +9953,11 @@
9828
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,);
9829
9954
  }
9830
9955
  }
9956
+ .motion-safe\:scroll-smooth {
9957
+ @media (prefers-reduced-motion: no-preference) {
9958
+ scroll-behavior: smooth;
9959
+ }
9960
+ }
9831
9961
  .motion-reduce\:hidden {
9832
9962
  @media (prefers-reduced-motion: reduce) {
9833
9963
  display: none;
@@ -14165,6 +14295,14 @@
14165
14295
  opacity: 0;
14166
14296
  }
14167
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
+ }
14168
14306
  @layer base {
14169
14307
  body {
14170
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.1",
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",