@ketvietlab/design-system 0.1.16 → 0.1.17

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.
Files changed (94) hide show
  1. package/README.md +29 -0
  2. package/dist/catalogue/catalogue.css +8 -0
  3. package/dist/catalogue/index.js +1 -1
  4. package/dist/catalogue/inventory-policy.json +21 -0
  5. package/dist/catalogue/inventory.generated.js +1 -1
  6. package/dist/catalogue/inventory.generated.js.map +1 -1
  7. package/dist/catalogue/inventory.generated.json +646 -84
  8. package/dist/catalogue/registry.d.ts.map +1 -1
  9. package/dist/catalogue/registry.js +6 -0
  10. package/dist/catalogue/registry.js.map +1 -1
  11. package/dist/catalogue/specimens.d.ts.map +1 -1
  12. package/dist/catalogue/specimens.js +113 -8
  13. package/dist/catalogue/specimens.js.map +1 -1
  14. package/dist/contract/index.d.ts.map +1 -1
  15. package/dist/contract/index.js +6 -0
  16. package/dist/contract/index.js.map +1 -1
  17. package/dist/data-display/bar-chart/index.d.ts +61 -0
  18. package/dist/data-display/bar-chart/index.d.ts.map +1 -0
  19. package/dist/data-display/bar-chart/index.js +64 -0
  20. package/dist/data-display/bar-chart/index.js.map +1 -0
  21. package/dist/data-display/bar-chart/styles.css +191 -0
  22. package/dist/data-display/matrix/index.d.ts +36 -0
  23. package/dist/data-display/matrix/index.d.ts.map +1 -0
  24. package/dist/data-display/matrix/index.js +28 -0
  25. package/dist/data-display/matrix/index.js.map +1 -0
  26. package/dist/data-display/matrix/styles.css +148 -0
  27. package/dist/data-operations/timeframe-filter/index.d.ts +34 -0
  28. package/dist/data-operations/timeframe-filter/index.d.ts.map +1 -0
  29. package/dist/data-operations/timeframe-filter/index.js +30 -0
  30. package/dist/data-operations/timeframe-filter/index.js.map +1 -0
  31. package/dist/data-operations/timeframe-filter/styles.css +109 -0
  32. package/dist/foundations/tokens.css +10 -0
  33. package/dist/index.d.ts +11 -3
  34. package/dist/index.d.ts.map +1 -1
  35. package/dist/index.js +4 -1
  36. package/dist/index.js.map +1 -1
  37. package/dist/interactions/menu/index.d.ts +17 -2
  38. package/dist/interactions/menu/index.d.ts.map +1 -1
  39. package/dist/interactions/menu/index.js +21 -5
  40. package/dist/interactions/menu/index.js.map +1 -1
  41. package/dist/interactions/menu/styles.css +36 -0
  42. package/dist/layouts/app-navigation/styles.css +8 -0
  43. package/dist/layouts/layout/index.d.ts +43 -3
  44. package/dist/layouts/layout/index.d.ts.map +1 -1
  45. package/dist/layouts/layout/index.js +28 -4
  46. package/dist/layouts/layout/index.js.map +1 -1
  47. package/dist/layouts/layout/styles.css +182 -4
  48. package/dist/layouts/page-identity/index.d.ts +19 -0
  49. package/dist/layouts/page-identity/index.d.ts.map +1 -0
  50. package/dist/layouts/page-identity/index.js +6 -0
  51. package/dist/layouts/page-identity/index.js.map +1 -0
  52. package/dist/layouts/shell/index.d.ts +7 -11
  53. package/dist/layouts/shell/index.d.ts.map +1 -1
  54. package/dist/layouts/shell/index.js +12 -2
  55. package/dist/layouts/shell/index.js.map +1 -1
  56. package/dist/layouts/shell/styles.css +16 -31
  57. package/dist/patterns/data-table/index.d.ts.map +1 -1
  58. package/dist/patterns/data-table/index.js +1 -1
  59. package/dist/patterns/data-table/index.js.map +1 -1
  60. package/dist/patterns/data-table/styles.css +124 -43
  61. package/dist/patterns/list-chrome/index.d.ts +2 -2
  62. package/dist/patterns/list-chrome/index.d.ts.map +1 -1
  63. package/dist/patterns/list-chrome/index.js +4 -3
  64. package/dist/patterns/list-chrome/index.js.map +1 -1
  65. package/dist/patterns/list-chrome/styles.css +122 -40
  66. package/dist/patterns/list-page/styles.css +5 -1
  67. package/dist/patterns/modal-sheet/styles.css +1 -1
  68. package/dist/patterns/page-shell/index.d.ts +2 -23
  69. package/dist/patterns/page-shell/index.d.ts.map +1 -1
  70. package/dist/patterns/page-shell/index.js +1 -10
  71. package/dist/patterns/page-shell/index.js.map +1 -1
  72. package/dist/patterns/page-shell/styles.css +131 -0
  73. package/dist/patterns/patterns.css +1 -0
  74. package/dist/primitives/feedback/index.d.ts.map +1 -1
  75. package/dist/primitives/feedback/index.js +1 -1
  76. package/dist/primitives/feedback/index.js.map +1 -1
  77. package/dist/primitives/feedback/styles.css +13 -11
  78. package/dist/primitives/navigation/index.d.ts +11 -5
  79. package/dist/primitives/navigation/index.d.ts.map +1 -1
  80. package/dist/primitives/navigation/index.js +17 -2
  81. package/dist/primitives/navigation/index.js.map +1 -1
  82. package/dist/primitives/navigation/styles.css +101 -13
  83. package/dist/primitives/status/index.d.ts.map +1 -1
  84. package/dist/primitives/status/index.js +2 -2
  85. package/dist/primitives/status/index.js.map +1 -1
  86. package/dist/primitives/status/styles.css +8 -8
  87. package/dist/record/display/index.js +1 -1
  88. package/dist/record/display/index.js.map +1 -1
  89. package/dist/record/display/styles.css +2 -2
  90. package/dist/runtime/index.d.ts.map +1 -1
  91. package/dist/runtime/index.js +99 -4
  92. package/dist/runtime/index.js.map +1 -1
  93. package/dist/styles.css +2 -50
  94. package/package.json +2 -2
@@ -1,19 +1,24 @@
1
1
  import type { JSXChild, TemplateResult } from '@ketvietlab/ketjs-view';
2
- export declare const HOOKS: readonly ['breadcrumbs', 'breadcrumb', 'nav-list', 'nav-item', 'nav-item-leading', 'nav-item-label', 'nav-item-count', 'tabs', 'tab', 'tab-count'];
2
+ export declare const HOOKS: readonly ['breadcrumbs', 'breadcrumb', 'breadcrumb-overflow', 'breadcrumb-overflow-trigger', 'breadcrumb-overflow-list', 'nav-list', 'nav-item', 'nav-item-leading', 'nav-item-label', 'nav-item-count', 'tabs', 'tab', 'tab-count'];
3
3
  export type BreadcrumbItem = {
4
4
  id?: string;
5
5
  label: string;
6
6
  href?: string;
7
7
  };
8
- export declare const Breadcrumbs: (props: {
8
+ export type BreadcrumbsProps = {
9
9
  label: string;
10
10
  items: readonly BreadcrumbItem[];
11
- }) => TemplateResult;
11
+ /** Keep the first and current locations visible; put intermediate ancestors in a native disclosure. */
12
+ maxItems?: number;
13
+ /** Accessible label for the collapsed ancestor trigger, supplied in the application's locale. */
14
+ overflowLabel?: string;
15
+ };
16
+ export declare const Breadcrumbs: (props: BreadcrumbsProps) => TemplateResult;
12
17
  export type NavItemProps = {
13
18
  label: string;
14
19
  href: string;
15
20
  leading?: JSXChild;
16
- count?: number;
21
+ count?: number | string;
17
22
  active?: boolean;
18
23
  };
19
24
  export declare const NavItem: (props: NavItemProps) => TemplateResult;
@@ -25,7 +30,8 @@ export type TabItem = {
25
30
  id: string;
26
31
  label: string;
27
32
  href: string;
28
- count?: number;
33
+ /** A number, or a bounded label such as "10.000+" when the exact total is not counted. */
34
+ count?: number | string;
29
35
  active?: boolean;
30
36
  };
31
37
  export declare const Tabs: (props: {
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../packages/design-system/src/primitives/navigation/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAA;AAEtE,eAAO,MAAM,KAAK,YAChB,aAAa,EACb,YAAY,EACZ,UAAU,EACV,UAAU,EACV,kBAAkB,EAClB,gBAAgB,EAChB,gBAAgB,EAChB,MAAM,EACN,KAAK,EACL,WAAW,CACH,CAAA;AAEV,MAAM,MAAM,cAAc,GAAG;IAC3B,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;CACd,CAAA;AAED,eAAO,MAAM,WAAW,UAAW;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,SAAS,cAAc,EAAE,CAAA;CAAE,KAAG,cAkBxF,CAAA;AAED,MAAM,MAAM,YAAY,GAAG;IACzB,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,CAAC,EAAE,QAAQ,CAAA;IAClB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,OAAO,CAAA;CACjB,CAAA;AAED,eAAO,MAAM,OAAO,UAAW,YAAY,KAAG,cAe7C,CAAA;AAED,eAAO,MAAM,OAAO,UAAW;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,SAAS,YAAY,EAAE,CAAA;CAAE,KAAG,cAUlF,CAAA;AAED,MAAM,MAAM,OAAO,GAAG;IACpB,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,OAAO,CAAA;CACjB,CAAA;AAED,eAAO,MAAM,IAAI,UAAW;IAC1B,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,SAAS,OAAO,EAAE,CAAA;IACzB,SAAS,CAAC,EAAE,QAAQ,CAAA;CACrB,KAAG,cAmBH,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../packages/design-system/src/primitives/navigation/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAA;AAEtE,eAAO,MAAM,KAAK,YAChB,aAAa,EACb,YAAY,EACZ,qBAAqB,EACrB,6BAA6B,EAC7B,0BAA0B,EAC1B,UAAU,EACV,UAAU,EACV,kBAAkB,EAClB,gBAAgB,EAChB,gBAAgB,EAChB,MAAM,EACN,KAAK,EACL,WAAW,CACH,CAAA;AAEV,MAAM,MAAM,cAAc,GAAG;IAC3B,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;CACd,CAAA;AAQD,MAAM,MAAM,gBAAgB,GAAG;IAC7B,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,SAAS,cAAc,EAAE,CAAA;IAChC,uGAAuG;IACvG,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,iGAAiG;IACjG,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB,CAAA;AAED,eAAO,MAAM,WAAW,UAAW,gBAAgB,KAAG,cA0DrD,CAAA;AAED,MAAM,MAAM,YAAY,GAAG;IACzB,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,CAAC,EAAE,QAAQ,CAAA;IAClB,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IACvB,MAAM,CAAC,EAAE,OAAO,CAAA;CACjB,CAAA;AAED,eAAO,MAAM,OAAO,UAAW,YAAY,KAAG,cAe7C,CAAA;AAED,eAAO,MAAM,OAAO,UAAW;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,SAAS,YAAY,EAAE,CAAA;CAAE,KAAG,cAUlF,CAAA;AAED,MAAM,MAAM,OAAO,GAAG;IACpB,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,0FAA0F;IAC1F,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IACvB,MAAM,CAAC,EAAE,OAAO,CAAA;CACjB,CAAA;AAED,eAAO,MAAM,IAAI,UAAW;IAC1B,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,SAAS,OAAO,EAAE,CAAA;IACzB,SAAS,CAAC,EAAE,QAAQ,CAAA;CACrB,KAAG,cAmBH,CAAA"}
@@ -3,6 +3,9 @@ import { each } from '@ketvietlab/ketjs-view';
3
3
  export const HOOKS = [
4
4
  'breadcrumbs',
5
5
  'breadcrumb',
6
+ 'breadcrumb-overflow',
7
+ 'breadcrumb-overflow-trigger',
8
+ 'breadcrumb-overflow-list',
6
9
  'nav-list',
7
10
  'nav-item',
8
11
  'nav-item-leading',
@@ -12,8 +15,20 @@ export const HOOKS = [
12
15
  'tab',
13
16
  'tab-count',
14
17
  ];
15
- export const Breadcrumbs = (props) => (_jsx("nav", { "data-ui": "breadcrumbs", "aria-label": props.label, children: _jsx("ol", { children: each(props.items, (item, index) => item.id ?? `${index}:${item.label}`, (item, index) => (_jsx("li", { "data-ui": "breadcrumb", children: item.href !== undefined && index < props.items.length - 1 ? (_jsx("a", { href: item.href, children: item.label })) : (_jsx("span", { "aria-current": index === props.items.length - 1 ? 'page' : null, children: item.label })) }))) }) }));
18
+ export const Breadcrumbs = (props) => {
19
+ const limit = Math.max(3, Math.floor(props.maxItems ?? props.items.length));
20
+ const overflow = props.items.length > limit;
21
+ const omitted = overflow ? props.items.slice(1, props.items.length - (limit - 2)) : [];
22
+ const visible = overflow
23
+ ? [
24
+ props.items[0],
25
+ { id: '__breadcrumb-overflow', kind: 'overflow', items: omitted },
26
+ ...props.items.slice(props.items.length - (limit - 2)),
27
+ ]
28
+ : props.items;
29
+ return (_jsx("nav", { "data-ui": "breadcrumbs", "data-pattern": "breadcrumbs", "aria-label": props.label, children: _jsx("ol", { children: each(visible, (item, index) => item.id ?? `${index}:${'label' in item ? item.label : 'overflow'}`, (item, index) => 'kind' in item ? (_jsx("li", { "data-ui": "breadcrumb-overflow", children: _jsxs("details", { children: [_jsx("summary", { "data-ui": "breadcrumb-overflow-trigger", "aria-label": props.overflowLabel ?? props.label, children: "\u2026" }), _jsx("ol", { "data-ui": "breadcrumb-overflow-list", children: each(item.items, (ancestor, ancestorIndex) => ancestor.id ?? `${ancestorIndex}:${ancestor.label}`, (ancestor) => (_jsx("li", { children: ancestor.href ? (_jsx("a", { href: ancestor.href, children: ancestor.label })) : (_jsx("span", { children: ancestor.label })) }))) })] }) })) : (_jsx("li", { "data-ui": "breadcrumb", children: item.href !== undefined && index < visible.length - 1 ? (_jsx("a", { href: item.href, children: item.label })) : (_jsx("span", { "aria-current": index === visible.length - 1 ? 'page' : null, children: item.label })) }))) }) }));
30
+ };
16
31
  export const NavItem = (props) => (_jsxs("a", { "data-ui": "nav-item", "data-active": props.active === true ? 'true' : null, href: props.href, "aria-current": props.active === true ? 'page' : null, children: [props.leading !== undefined && (_jsx("span", { "data-ui": "nav-item-leading", "aria-hidden": "true", children: props.leading })), _jsx("span", { "data-ui": "nav-item-label", children: props.label }), props.count !== undefined && _jsx("span", { "data-ui": "nav-item-count", children: String(props.count) })] }));
17
32
  export const NavList = (props) => (_jsx("nav", { "data-ui": "nav-list", "aria-label": props.label, children: each(props.items, (item) => `${item.href}:${item.label}`, (item) => (_jsx(NavItem, { ...item }))) }));
18
- export const Tabs = (props) => (_jsxs("nav", { "data-ui": "tabs", "aria-label": props.label, children: [each(props.items, (item) => item.id, (item) => (_jsxs("a", { "data-ui": "tab", "data-active": item.active === true ? 'true' : null, href: item.href, "aria-current": item.active === true ? 'page' : null, children: [item.label, item.count !== undefined && _jsx("span", { "data-ui": "tab-count", children: String(item.count) })] }))), props.extension] }));
33
+ export const Tabs = (props) => (_jsxs("nav", { "data-ui": "tabs", "data-pattern": "tabs", "aria-label": props.label, children: [each(props.items, (item) => item.id, (item) => (_jsxs("a", { "data-ui": "tab", "data-active": item.active === true ? 'true' : null, href: item.href, "aria-current": item.active === true ? 'page' : null, children: [item.label, item.count !== undefined && _jsx("span", { "data-ui": "tab-count", children: String(item.count) })] }))), props.extension] }));
19
34
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../../packages/design-system/src/primitives/navigation/index.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../../packages/design-system/src/primitives/navigation/index.tsx"],"names":[],"mappings":"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"}
@@ -1,9 +1,9 @@
1
1
  @layer ket.app {
2
- :where([data-kv-design-system]) [data-ui="breadcrumbs"] {
2
+ :where([data-kv-design-system]) [data-ui="breadcrumbs"][data-pattern="breadcrumbs"] {
3
3
  min-width: 0;
4
4
  }
5
5
 
6
- :where([data-kv-design-system]) [data-ui="breadcrumbs"] ol {
6
+ :where([data-kv-design-system]) [data-ui="breadcrumbs"][data-pattern="breadcrumbs"] ol {
7
7
  display: flex;
8
8
  min-width: 0;
9
9
  align-items: center;
@@ -15,37 +15,114 @@
15
15
  list-style: none;
16
16
  }
17
17
 
18
- :where([data-kv-design-system]) [data-ui="breadcrumb"] {
18
+ :where([data-kv-design-system])
19
+ [data-ui="breadcrumbs"][data-pattern="breadcrumbs"]
20
+ :is([data-ui="breadcrumb"], [data-ui="breadcrumb-overflow"]) {
19
21
  display: inline-flex;
20
22
  min-width: 0;
21
23
  align-items: center;
22
24
  gap: var(--kv-space-1-5);
25
+ color: inherit;
23
26
  }
24
27
 
25
- :where([data-kv-design-system]) [data-ui="breadcrumb"] + [data-ui="breadcrumb"]::before {
28
+ :where([data-kv-design-system])
29
+ [data-ui="breadcrumbs"][data-pattern="breadcrumbs"]
30
+ :is([data-ui="breadcrumb"], [data-ui="breadcrumb-overflow"])
31
+ + :is([data-ui="breadcrumb"], [data-ui="breadcrumb-overflow"])::before {
26
32
  flex: none;
27
33
  color: var(--kv-border-strong);
28
34
  content: "/";
29
35
  }
30
36
 
31
- :where([data-kv-design-system]) [data-ui="breadcrumb"] :is(a, span) {
37
+ :where([data-kv-design-system]) [data-ui="breadcrumb-overflow"] {
38
+ position: relative;
39
+ }
40
+
41
+ :where([data-kv-design-system]) [data-ui="breadcrumb-overflow"] details {
42
+ position: relative;
43
+ }
44
+
45
+ :where([data-kv-design-system]) [data-ui="breadcrumb-overflow-trigger"] {
46
+ display: grid;
47
+ min-width: 1.5rem;
48
+ min-height: 1.5rem;
49
+ place-items: center;
50
+ border-radius: var(--kv-radius-sm);
51
+ cursor: pointer;
52
+ list-style: none;
53
+ }
54
+
55
+ :where([data-kv-design-system]) [data-ui="breadcrumb-overflow-trigger"]::-webkit-details-marker {
56
+ display: none;
57
+ }
58
+
59
+ :where([data-kv-design-system]) [data-ui="breadcrumb-overflow-trigger"]:hover {
60
+ background: var(--kv-interactive-hover);
61
+ color: var(--kv-text-main);
62
+ }
63
+
64
+ :where([data-kv-design-system]) [data-ui="breadcrumb-overflow-list"] {
65
+ position: absolute;
66
+ z-index: var(--kv-layer-menu);
67
+ top: calc(100% + var(--kv-space-1));
68
+ left: 0;
69
+ display: grid;
70
+ width: max-content;
71
+ max-width: min(20rem, calc(100vw - var(--kv-space-8)));
72
+ gap: var(--kv-space-0-5);
73
+ padding: var(--kv-space-1);
74
+ border: 1px solid var(--kv-border-default);
75
+ border-radius: var(--kv-radius-md);
76
+ background: var(--kv-panel-bg);
77
+ box-shadow: var(--kv-shadow-popover);
78
+ }
79
+
80
+ :where([data-kv-design-system]) [data-ui="breadcrumb-overflow-list"] li {
81
+ display: contents;
82
+ }
83
+
84
+ :where([data-kv-design-system]) [data-ui="breadcrumb-overflow-list"] :is(a, span) {
85
+ display: block;
86
+ padding: var(--kv-space-2) var(--kv-space-3);
87
+ border-radius: var(--kv-radius-sm);
88
+ color: var(--kv-text-main);
89
+ text-decoration: none;
90
+ }
91
+
92
+ :where([data-kv-design-system]) [data-ui="breadcrumb-overflow-list"] a:hover {
93
+ background: var(--kv-interactive-hover);
94
+ }
95
+
96
+ :where([data-kv-design-system])
97
+ [data-ui="breadcrumbs"][data-pattern="breadcrumbs"]
98
+ [data-ui="breadcrumb"]
99
+ :is(a, span) {
32
100
  overflow: hidden;
33
101
  color: inherit;
34
102
  text-overflow: ellipsis;
35
103
  white-space: nowrap;
36
104
  }
37
105
 
38
- :where([data-kv-design-system]) [data-ui="breadcrumb"] a {
106
+ :where([data-kv-design-system])
107
+ [data-ui="breadcrumbs"][data-pattern="breadcrumbs"]
108
+ [data-ui="breadcrumb"]
109
+ a {
39
110
  text-decoration: none;
40
111
  }
41
112
 
42
- :where([data-kv-design-system]) [data-ui="breadcrumb"] a:hover {
113
+ :where([data-kv-design-system])
114
+ [data-ui="breadcrumbs"][data-pattern="breadcrumbs"]
115
+ [data-ui="breadcrumb"]
116
+ a:hover {
43
117
  color: var(--kv-text-main);
44
118
  text-decoration: underline;
45
119
  text-underline-offset: 0.1875rem;
46
120
  }
47
121
 
48
- :where([data-kv-design-system]) [data-ui="breadcrumb"] [aria-current="page"] {
122
+ :where([data-kv-design-system])
123
+ [data-ui="breadcrumbs"][data-pattern="breadcrumbs"]
124
+ [data-ui="breadcrumb"]
125
+ [aria-current="page"] {
49
126
  color: var(--kv-text-main);
50
127
  font-weight: var(--kv-weight-medium);
51
128
  }
@@ -107,7 +184,7 @@
107
184
  opacity: 0.72;
108
185
  }
109
186
 
110
- :where([data-kv-design-system]) [data-ui="tabs"] {
187
+ :where([data-kv-design-system]) [data-ui="tabs"][data-pattern="tabs"] {
111
188
  display: flex;
112
189
  min-height: var(--kv-table-header-height);
113
190
  align-items: center;
@@ -116,28 +193,33 @@
116
193
  overflow-x: auto;
117
194
  }
118
195
 
119
- :where([data-kv-design-system]) [data-ui="tab"] {
196
+ :where([data-kv-design-system]) [data-ui="tabs"][data-pattern="tabs"] [data-ui="tab"] {
120
197
  position: relative;
121
198
  display: inline-flex;
122
199
  height: var(--kv-table-header-height);
123
200
  flex: none;
124
201
  align-items: center;
125
202
  gap: var(--kv-space-1-5);
203
+ padding: 0;
204
+ border: 0;
205
+ background: transparent;
126
206
  color: var(--kv-text-muted);
127
207
  font-size: var(--kv-text-sm);
128
208
  font-weight: var(--kv-weight-medium);
129
209
  text-decoration: none;
130
210
  }
131
211
 
132
- :where([data-kv-design-system]) [data-ui="tab"]:hover {
212
+ :where([data-kv-design-system]) [data-ui="tabs"][data-pattern="tabs"] [data-ui="tab"]:hover {
133
213
  color: var(--kv-text-secondary);
134
214
  }
135
215
 
136
- :where([data-kv-design-system]) [data-ui="tab"][data-active="true"] {
216
+ :where([data-kv-design-system]) [data-ui="tabs"][data-pattern="tabs"] [data-ui="tab"][data-active="true"] {
137
217
  color: var(--kv-tab-active-text);
138
218
  }
139
219
 
140
- :where([data-kv-design-system]) [data-ui="tab"][data-active="true"]::after {
220
+ :where([data-kv-design-system])
221
+ [data-ui="tabs"][data-pattern="tabs"]
222
+ [data-ui="tab"][data-active="true"]::after {
141
223
  position: absolute;
142
224
  right: 0;
143
225
  bottom: -1px;
@@ -147,4 +229,10 @@
147
229
  background: var(--kv-accent);
148
230
  content: "";
149
231
  }
232
+
233
+ :where([data-kv-design-system])
234
+ [data-ui="breadcrumbs"][data-pattern="breadcrumbs"]
235
+ [data-ui="breadcrumb"]::after {
236
+ content: none;
237
+ }
150
238
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../packages/design-system/src/primitives/status/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAA;AAE5D,eAAO,MAAM,KAAK,YAAI,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,CAAU,CAAA;AAE7F,MAAM,MAAM,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,UAAU,GAAG,SAAS,GAAG,QAAQ,CAAA;AAEzE,eAAO,MAAM,KAAK,UAAW;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,IAAI,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,KAAG,cAI7E,CAAA;AAED,eAAO,MAAM,GAAG,UAAW;IACzB,KAAK,EAAE,MAAM,CAAA;IACb,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAC5B,KAAG,cAaH,CAAA;AAED,eAAO,MAAM,UAAU,UAAW;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,KAAG,cAIpE,CAAA;AAED,eAAO,MAAM,QAAQ,SAAU,MAAM,KAAG,MAMvC,CAAA;AAED,eAAO,MAAM,MAAM,UAAW;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,GAAG,SAAS,GAAG,OAAO,CAAA;CAAE,KAAG,cAItF,CAAA;AAED,eAAO,MAAM,IAAI,UAAW;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,KAAG,cAIxE,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../packages/design-system/src/primitives/status/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAA;AAE5D,eAAO,MAAM,KAAK,YAAI,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,CAAU,CAAA;AAE7F,MAAM,MAAM,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,UAAU,GAAG,SAAS,GAAG,QAAQ,CAAA;AAEzE,eAAO,MAAM,KAAK,UAAW;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,IAAI,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,KAAG,cAS7E,CAAA;AAED,eAAO,MAAM,GAAG,UAAW;IACzB,KAAK,EAAE,MAAM,CAAA;IACb,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAC5B,KAAG,cAaH,CAAA;AAED,eAAO,MAAM,UAAU,UAAW;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,KAAG,cAIpE,CAAA;AAED,eAAO,MAAM,QAAQ,SAAU,MAAM,KAAG,MAMvC,CAAA;AAED,eAAO,MAAM,MAAM,UAAW;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,GAAG,SAAS,GAAG,OAAO,CAAA;CAAE,KAAG,cAUtF,CAAA;AAED,eAAO,MAAM,IAAI,UAAW;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,KAAG,cAIxE,CAAA"}
@@ -1,6 +1,6 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "@ketvietlab/ketjs-view/jsx-runtime";
2
2
  export const HOOKS = ['badge', 'tag', 'tag-remove', 'count-badge', 'avatar', 'code'];
3
- export const Badge = (props) => (_jsx("span", { "data-ui": "badge", "data-tone": props.tone ?? 'neutral', "data-value": props.value ?? '', children: props.label }));
3
+ export const Badge = (props) => (_jsx("span", { "data-ui": "badge", "data-pattern": "badge", "data-tone": props.tone ?? 'neutral', "data-value": props.value ?? '', children: props.label }));
4
4
  export const Tag = (props) => (_jsxs("span", { "data-ui": "tag", children: [props.label, !!props.removeHref && (_jsx("a", { "data-ui": "tag-remove", href: props.removeHref, "aria-label": props.removeLabel ?? `Remove ${props.label}`, children: "\u00D7" }))] }));
5
5
  export const CountBadge = (props) => (_jsx("span", { "data-ui": "count-badge", role: "status", "aria-label": props.label, children: String(props.count) }));
6
6
  export const initials = (name) => {
@@ -11,6 +11,6 @@ export const initials = (name) => {
11
11
  const second = parts.length > 2 ? parts[parts.length - 2] : '';
12
12
  return (second.slice(0, 1) + first.slice(0, 1)).toLocaleUpperCase('vi');
13
13
  };
14
- export const Avatar = (props) => (_jsx("span", { "data-ui": "avatar", "data-size": props.size ?? 'default', title: props.name, "aria-hidden": "true", children: initials(props.name) }));
14
+ export const Avatar = (props) => (_jsx("span", { "data-ui": "avatar", "data-pattern": "avatar", "data-size": props.size ?? 'default', title: props.name, "aria-hidden": "true", children: initials(props.name) }));
15
15
  export const Code = (props) => (_jsx("code", { "data-ui": "code", "data-context": props.context ?? null, children: props.value }));
16
16
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../../packages/design-system/src/primitives/status/index.tsx"],"names":[],"mappings":";AAEA,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,CAAU,CAAA;AAI7F,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,KAAqD,EAAkB,EAAE,CAAC,CAC9F,0BAAc,OAAO,eAAY,KAAK,CAAC,IAAI,IAAI,SAAS,gBAAc,KAAK,CAAC,KAAK,IAAI,EAAE,YACpF,KAAK,CAAC,KAAK,GACP,CACR,CAAA;AAED,MAAM,CAAC,MAAM,GAAG,GAAG,CAAC,KAInB,EAAkB,EAAE,CAAC,CACpB,2BAAc,KAAK,aAChB,KAAK,CAAC,KAAK,EACX,CAAC,CAAC,KAAK,CAAC,UAAU,IAAI,CACrB,uBACU,YAAY,EACpB,IAAI,EAAE,KAAK,CAAC,UAAU,gBACV,KAAK,CAAC,WAAW,IAAI,UAAU,KAAK,CAAC,KAAK,EAAE,uBAGtD,CACL,IACI,CACR,CAAA;AAED,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,KAAuC,EAAkB,EAAE,CAAC,CACrF,0BAAc,aAAa,EAAC,IAAI,EAAC,QAAQ,gBAAa,KAAK,CAAC,KAAK,YAC9D,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,GACf,CACR,CAAA;AAED,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,IAAY,EAAU,EAAE;IAC/C,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;IACtD,IAAI,CAAC,KAAK,CAAC,MAAM;QAAE,OAAO,GAAG,CAAA;IAC7B,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAE,CAAA;IACrE,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC,CAAC,CAAC,EAAE,CAAA;IAC/D,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAA;AACzE,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,KAA6D,EAAkB,EAAE,CAAC,CACvG,0BAAc,QAAQ,eAAY,KAAK,CAAC,IAAI,IAAI,SAAS,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,iBAAc,MAAM,YAC7F,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,GAChB,CACR,CAAA;AAED,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,KAAiD,EAAkB,EAAE,CAAC,CACzF,0BAAc,MAAM,kBAAe,KAAK,CAAC,OAAO,IAAI,IAAI,YACrD,KAAK,CAAC,KAAK,GACP,CACR,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../../packages/design-system/src/primitives/status/index.tsx"],"names":[],"mappings":";AAEA,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,CAAU,CAAA;AAI7F,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,KAAqD,EAAkB,EAAE,CAAC,CAC9F,0BACU,OAAO,kBACF,OAAO,eACT,KAAK,CAAC,IAAI,IAAI,SAAS,gBACtB,KAAK,CAAC,KAAK,IAAI,EAAE,YAE5B,KAAK,CAAC,KAAK,GACP,CACR,CAAA;AAED,MAAM,CAAC,MAAM,GAAG,GAAG,CAAC,KAInB,EAAkB,EAAE,CAAC,CACpB,2BAAc,KAAK,aAChB,KAAK,CAAC,KAAK,EACX,CAAC,CAAC,KAAK,CAAC,UAAU,IAAI,CACrB,uBACU,YAAY,EACpB,IAAI,EAAE,KAAK,CAAC,UAAU,gBACV,KAAK,CAAC,WAAW,IAAI,UAAU,KAAK,CAAC,KAAK,EAAE,uBAGtD,CACL,IACI,CACR,CAAA;AAED,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,KAAuC,EAAkB,EAAE,CAAC,CACrF,0BAAc,aAAa,EAAC,IAAI,EAAC,QAAQ,gBAAa,KAAK,CAAC,KAAK,YAC9D,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,GACf,CACR,CAAA;AAED,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,IAAY,EAAU,EAAE;IAC/C,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;IACtD,IAAI,CAAC,KAAK,CAAC,MAAM;QAAE,OAAO,GAAG,CAAA;IAC7B,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAE,CAAA;IACrE,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC,CAAC,CAAC,EAAE,CAAA;IAC/D,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAA;AACzE,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,KAA6D,EAAkB,EAAE,CAAC,CACvG,0BACU,QAAQ,kBACH,QAAQ,eACV,KAAK,CAAC,IAAI,IAAI,SAAS,EAClC,KAAK,EAAE,KAAK,CAAC,IAAI,iBACL,MAAM,YAEjB,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,GAChB,CACR,CAAA;AAED,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,KAAiD,EAAkB,EAAE,CAAC,CACzF,0BAAc,MAAM,kBAAe,KAAK,CAAC,OAAO,IAAI,IAAI,YACrD,KAAK,CAAC,KAAK,GACP,CACR,CAAA"}
@@ -1,5 +1,5 @@
1
1
  @layer ket.app {
2
- :where([data-kv-design-system]) [data-ui="badge"] {
2
+ :where([data-kv-design-system]) [data-ui="badge"][data-pattern="badge"] {
3
3
  display: inline-flex;
4
4
  min-height: 1.4rem;
5
5
  align-items: center;
@@ -16,22 +16,22 @@
16
16
  overflow-wrap: anywhere;
17
17
  }
18
18
 
19
- :where([data-kv-design-system]) [data-ui="badge"][data-tone="info"] {
19
+ :where([data-kv-design-system]) [data-ui="badge"][data-pattern="badge"][data-tone="info"] {
20
20
  background: var(--kv-color-info-soft);
21
21
  color: var(--kv-color-info);
22
22
  }
23
23
 
24
- :where([data-kv-design-system]) [data-ui="badge"][data-tone="positive"] {
24
+ :where([data-kv-design-system]) [data-ui="badge"][data-pattern="badge"][data-tone="positive"] {
25
25
  background: var(--kv-color-positive-soft);
26
26
  color: var(--kv-color-positive);
27
27
  }
28
28
 
29
- :where([data-kv-design-system]) [data-ui="badge"][data-tone="warning"] {
29
+ :where([data-kv-design-system]) [data-ui="badge"][data-pattern="badge"][data-tone="warning"] {
30
30
  background: var(--kv-color-warning-soft);
31
31
  color: var(--kv-color-warning);
32
32
  }
33
33
 
34
- :where([data-kv-design-system]) [data-ui="badge"][data-tone="danger"] {
34
+ :where([data-kv-design-system]) [data-ui="badge"][data-pattern="badge"][data-tone="danger"] {
35
35
  background: var(--kv-color-danger-soft);
36
36
  color: var(--kv-color-danger);
37
37
  }
@@ -78,7 +78,7 @@
78
78
  font-weight: 800;
79
79
  }
80
80
 
81
- :where([data-kv-design-system]) [data-ui="avatar"] {
81
+ :where([data-kv-design-system]) [data-ui="avatar"][data-pattern="avatar"] {
82
82
  display: inline-grid;
83
83
  width: 2rem;
84
84
  height: 2rem;
@@ -91,12 +91,12 @@
91
91
  font-weight: 800;
92
92
  }
93
93
 
94
- :where([data-kv-design-system]) [data-ui="avatar"][data-size="small"] {
94
+ :where([data-kv-design-system]) [data-ui="avatar"][data-pattern="avatar"][data-size="small"] {
95
95
  width: 1.5rem;
96
96
  height: 1.5rem;
97
97
  }
98
98
 
99
- :where([data-kv-design-system]) [data-ui="avatar"][data-size="large"] {
99
+ :where([data-kv-design-system]) [data-ui="avatar"][data-pattern="avatar"][data-size="large"] {
100
100
  width: 3rem;
101
101
  height: 3rem;
102
102
  font-size: var(--kv-text-sm);
@@ -13,7 +13,7 @@ export const HOOKS = [
13
13
  ];
14
14
  export const KeyValue = (props) => (_jsxs("div", { "data-ui": "key-value", children: [_jsx("dt", { "data-ui": "key-value-label", children: props.label }), _jsx("dd", { "data-ui": "key-value-value", children: props.value ?? props.emptyLabel ?? '—' })] }));
15
15
  export const DescriptionList = (props) => (_jsx("dl", { "data-ui": "description-list", "aria-label": props.label, "data-columns": String(props.columns ?? 2), children: each(props.items, (item) => item.id, (item) => (_jsx(KeyValue, { ...item }))) }));
16
- export const Person = (props) => (_jsxs("span", { "data-ui": "person", children: [_jsx(Avatar, { name: props.name, size: props.size }), _jsxs("span", { "data-ui": "person-body", children: [props.href ? _jsx("a", { href: props.href, children: props.name }) : _jsx("strong", { children: props.name }), props.detail !== undefined && _jsx("small", { children: props.detail })] })] }));
16
+ export const Person = (props) => (_jsxs("span", { "data-ui": "person", "data-pattern": "person", children: [_jsx(Avatar, { name: props.name, size: props.size }), _jsxs("span", { "data-ui": "person-body", children: [props.href ? _jsx("a", { href: props.href, children: props.name }) : _jsx("strong", { children: props.name }), props.detail !== undefined && _jsx("small", { children: props.detail })] })] }));
17
17
  export const AvatarGroup = (props) => {
18
18
  const visible = props.people.slice(0, props.max ?? 4);
19
19
  const remaining = props.people.length - visible.length;
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../../packages/design-system/src/record/display/index.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAA;AAE7C,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,kCAAmC,CAAA;AAGjE,MAAM,CAAC,MAAM,KAAK,GAAG;IACnB,kBAAkB;IAClB,WAAW;IACX,iBAAiB;IACjB,iBAAiB;IACjB,QAAQ;IACR,aAAa;IACb,cAAc;IACd,QAAQ;CACA,CAAA;AAGV,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,KAAoB,EAAkB,EAAE,CAAC,CAChE,0BAAa,WAAW,aACtB,wBAAY,iBAAiB,YAAE,KAAK,CAAC,KAAK,GAAM,EAChD,wBAAY,iBAAiB,YAAE,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,UAAU,IAAI,GAAG,GAAM,IACvE,CACP,CAAA;AAED,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,KAI/B,EAAkB,EAAE,CAAC,CACpB,wBAAY,kBAAkB,gBAAa,KAAK,CAAC,KAAK,kBAAgB,MAAM,CAAC,KAAK,CAAC,OAAO,IAAI,CAAC,CAAC,YAC7F,IAAI,CACH,KAAK,CAAC,KAAK,EACX,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,EACjB,CAAC,IAAI,EAAE,EAAE,CAAC,CACR,KAAC,QAAQ,OAAK,IAAI,GAAI,CACvB,CACF,GACE,CACN,CAAA;AAQD,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,KAAkB,EAAkB,EAAE,CAAC,CAC5D,2BAAc,QAAQ,aACpB,KAAC,MAAM,IAAC,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,GAAI,EAC9C,2BAAc,aAAa,aACxB,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,YAAG,IAAI,EAAE,KAAK,CAAC,IAAI,YAAG,KAAK,CAAC,IAAI,GAAK,CAAC,CAAC,CAAC,2BAAS,KAAK,CAAC,IAAI,GAAU,EAClF,KAAK,CAAC,MAAM,KAAK,SAAS,IAAI,0BAAQ,KAAK,CAAC,MAAM,GAAS,IACvD,IACF,CACR,CAAA;AAED,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,KAI3B,EAAkB,EAAE;IACnB,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC,CAAA;IACrD,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAA;IACtD,OAAO,CACL,2BAAc,cAAc,EAAC,IAAI,EAAC,OAAO,gBAAa,KAAK,CAAC,KAAK,aAC9D,IAAI,CACH,OAAO,EACP,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,EACrB,CAAC,MAAM,EAAE,EAAE,CAAC,CACV,KAAC,MAAM,IAAC,IAAI,EAAE,MAAM,CAAC,IAAI,GAAI,CAC9B,CACF,EACA,SAAS,GAAG,CAAC,IAAI,CAChB,gBAAM,IAAI,EAAC,KAAK,gBAAa,GAAG,SAAS,cAAc,EAAE,KAAK,EAAE,GAAG,SAAS,cAAc,kBACtF,MAAM,CAAC,SAAS,CAAC,IACd,CACR,IACI,CACR,CAAA;AACH,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,KAAsD,EAAkB,EAAE,CAAC,CAChG,0BAAc,QAAQ,EAAC,KAAK,EAAE,KAAK,CAAC,MAAM,YACxC,KAAC,KAAK,IAAC,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,GAAI,GAC1C,CACR,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../../packages/design-system/src/record/display/index.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAA;AAE7C,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,kCAAmC,CAAA;AAGjE,MAAM,CAAC,MAAM,KAAK,GAAG;IACnB,kBAAkB;IAClB,WAAW;IACX,iBAAiB;IACjB,iBAAiB;IACjB,QAAQ;IACR,aAAa;IACb,cAAc;IACd,QAAQ;CACA,CAAA;AAGV,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,KAAoB,EAAkB,EAAE,CAAC,CAChE,0BAAa,WAAW,aACtB,wBAAY,iBAAiB,YAAE,KAAK,CAAC,KAAK,GAAM,EAChD,wBAAY,iBAAiB,YAAE,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,UAAU,IAAI,GAAG,GAAM,IACvE,CACP,CAAA;AAED,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,KAI/B,EAAkB,EAAE,CAAC,CACpB,wBAAY,kBAAkB,gBAAa,KAAK,CAAC,KAAK,kBAAgB,MAAM,CAAC,KAAK,CAAC,OAAO,IAAI,CAAC,CAAC,YAC7F,IAAI,CACH,KAAK,CAAC,KAAK,EACX,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,EACjB,CAAC,IAAI,EAAE,EAAE,CAAC,CACR,KAAC,QAAQ,OAAK,IAAI,GAAI,CACvB,CACF,GACE,CACN,CAAA;AAQD,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,KAAkB,EAAkB,EAAE,CAAC,CAC5D,2BAAc,QAAQ,kBAAc,QAAQ,aAC1C,KAAC,MAAM,IAAC,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,GAAI,EAC9C,2BAAc,aAAa,aACxB,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,YAAG,IAAI,EAAE,KAAK,CAAC,IAAI,YAAG,KAAK,CAAC,IAAI,GAAK,CAAC,CAAC,CAAC,2BAAS,KAAK,CAAC,IAAI,GAAU,EAClF,KAAK,CAAC,MAAM,KAAK,SAAS,IAAI,0BAAQ,KAAK,CAAC,MAAM,GAAS,IACvD,IACF,CACR,CAAA;AAED,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,KAI3B,EAAkB,EAAE;IACnB,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC,CAAA;IACrD,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAA;IACtD,OAAO,CACL,2BAAc,cAAc,EAAC,IAAI,EAAC,OAAO,gBAAa,KAAK,CAAC,KAAK,aAC9D,IAAI,CACH,OAAO,EACP,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,EACrB,CAAC,MAAM,EAAE,EAAE,CAAC,CACV,KAAC,MAAM,IAAC,IAAI,EAAE,MAAM,CAAC,IAAI,GAAI,CAC9B,CACF,EACA,SAAS,GAAG,CAAC,IAAI,CAChB,gBAAM,IAAI,EAAC,KAAK,gBAAa,GAAG,SAAS,cAAc,EAAE,KAAK,EAAE,GAAG,SAAS,cAAc,kBACtF,MAAM,CAAC,SAAS,CAAC,IACd,CACR,IACI,CACR,CAAA;AACH,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,KAAsD,EAAkB,EAAE,CAAC,CAChG,0BAAc,QAAQ,EAAC,KAAK,EAAE,KAAK,CAAC,MAAM,YACxC,KAAC,KAAK,IAAC,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,GAAI,GAC1C,CACR,CAAA"}
@@ -31,13 +31,13 @@
31
31
  overflow-wrap: anywhere;
32
32
  }
33
33
 
34
- :where([data-kv-design-system]) [data-ui="person"] {
34
+ :where([data-kv-design-system]) [data-ui="person"][data-pattern="person"] {
35
35
  display: inline-flex;
36
36
  align-items: center;
37
37
  gap: var(--kv-space-2);
38
38
  }
39
39
 
40
- :where([data-kv-design-system]) [data-ui="person-body"] {
40
+ :where([data-kv-design-system]) [data-ui="person"][data-pattern="person"] [data-ui="person-body"] {
41
41
  display: grid;
42
42
  gap: 1px;
43
43
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../packages/design-system/src/runtime/index.js"],"names":[],"mappings":"AAsBA;;;;;;GAMG;AACH,eAAO,MAAM,8BAA8B,UAHhC,UAAU,KACR,MAAM,IAyVlB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../packages/design-system/src/runtime/index.js"],"names":[],"mappings":"AAsBA;;;;;;GAMG;AACH,eAAO,MAAM,8BAA8B,UAHhC,UAAU,KACR,MAAM,IAwblB,CAAA"}
@@ -38,6 +38,21 @@ export const attachDesignSystemInteractions = (root = document) => {
38
38
  ;(first instanceof HTMLElement ? first : modal).focus()
39
39
  }
40
40
 
41
+ const menus = /** @type {HTMLDetailsElement[]} */ (
42
+ [...root.querySelectorAll('[data-ui="menu"]')].filter((menu) => menu instanceof HTMLDetailsElement)
43
+ )
44
+ /** @param {HTMLDetailsElement} menu */
45
+ const syncMenu = (menu) => {
46
+ const trigger = menu.querySelector('[data-ui="menu-trigger"]')
47
+ if (trigger instanceof HTMLElement) trigger.setAttribute('aria-expanded', String(menu.open))
48
+ }
49
+ const menuCleanups = menus.map((menu) => {
50
+ const onToggle = () => syncMenu(menu)
51
+ menu.addEventListener('toggle', onToggle)
52
+ syncMenu(menu)
53
+ return () => menu.removeEventListener('toggle', onToggle)
54
+ })
55
+
41
56
  const navigationMedia = window.matchMedia('(max-width: 48rem)')
42
57
  const navigationRoot = document.documentElement
43
58
  const priorNavigationOpen = navigationRoot.dataset.kvNavigationOpen
@@ -284,13 +299,33 @@ export const attachDesignSystemInteractions = (root = document) => {
284
299
  return
285
300
  }
286
301
  }
302
+ const activeMenu = document.activeElement?.closest('[data-ui="menu"]')
303
+ if (activeMenu instanceof HTMLDetailsElement && !activeMenu.open) {
304
+ const trigger = activeMenu.querySelector('[data-ui="menu-trigger"]')
305
+ if (document.activeElement === trigger && (event.key === 'ArrowDown' || event.key === 'ArrowUp')) {
306
+ activeMenu.open = true
307
+ const items = /** @type {HTMLElement[]} */ (
308
+ [
309
+ ...activeMenu.querySelectorAll(
310
+ '[role="menuitem"], [role="menuitemcheckbox"], [role="menuitemradio"]',
311
+ ),
312
+ ].filter((item) => item instanceof HTMLElement && item.getAttribute('aria-disabled') !== 'true')
313
+ )
314
+ const item = event.key === 'ArrowUp' ? items.at(-1) : items[0]
315
+ if (item instanceof HTMLElement) item.focus()
316
+ event.preventDefault()
317
+ return
318
+ }
319
+ }
287
320
  const openMenu = document.activeElement?.closest('[data-ui="menu"][open]')
288
321
  if (openMenu instanceof HTMLDetailsElement) {
289
322
  const trigger = openMenu.querySelector('[data-ui="menu-trigger"]')
290
323
  const items = /** @type {HTMLElement[]} */ (
291
- [...openMenu.querySelectorAll('[role="menuitem"]')].filter(
292
- (item) => item instanceof HTMLElement && item.getAttribute('aria-disabled') !== 'true',
293
- )
324
+ [
325
+ ...openMenu.querySelectorAll(
326
+ '[role="menuitem"], [role="menuitemcheckbox"], [role="menuitemradio"]',
327
+ ),
328
+ ].filter((item) => item instanceof HTMLElement && item.getAttribute('aria-disabled') !== 'true')
294
329
  )
295
330
  const active = document.activeElement
296
331
  const activeIndex = active instanceof HTMLElement ? items.indexOf(active) : -1
@@ -349,12 +384,70 @@ export const attachDesignSystemInteractions = (root = document) => {
349
384
  if (first instanceof HTMLElement) first.focus()
350
385
  }
351
386
  }
387
+ /**
388
+ * Table selection. `select-all` toggles the enabled row checkboxes of its own table, a row
389
+ * change keeps the header checked or indeterminate, and every bulk bar bound to the same form
390
+ * (`data-form`) shows the live count and enables its actions only while something is selected.
391
+ *
392
+ * @param {Element} table
393
+ */
394
+ const syncSelection = (table) => {
395
+ const rows = /** @type {HTMLInputElement[]} */ (
396
+ [...table.querySelectorAll('[data-ui="row-select"]')].filter(
397
+ (input) => input instanceof HTMLInputElement && !input.disabled,
398
+ )
399
+ )
400
+ const checked = rows.filter((input) => input.checked)
401
+ const all = table.querySelector('[data-ui="select-all"]')
402
+ if (all instanceof HTMLInputElement) {
403
+ all.checked = rows.length > 0 && checked.length === rows.length
404
+ all.indeterminate = checked.length > 0 && checked.length < rows.length
405
+ }
406
+ for (const input of rows)
407
+ input.closest('[data-ui="row"]')?.toggleAttribute('data-selected', input.checked)
408
+ const form = rows[0]?.getAttribute('form')
409
+ if (!form) return
410
+ for (const bar of document.querySelectorAll(
411
+ `[data-ui="bulk-actions"][data-form="${CSS.escape(form)}"]`,
412
+ )) {
413
+ if (checked.length) bar.setAttribute('data-has-selection', 'true')
414
+ else bar.removeAttribute('data-has-selection')
415
+ for (const count of bar.querySelectorAll('[data-ui="bulk-count"]'))
416
+ count.textContent = String(checked.length)
417
+ for (const button of bar.querySelectorAll('[data-ui="bulk-action-list"] button')) {
418
+ if (button instanceof HTMLButtonElement && button.dataset.kvAlwaysDisabled !== 'true')
419
+ button.disabled = checked.length === 0
420
+ }
421
+ }
422
+ }
423
+ /** @param {Event} event */
424
+ const onSelectionChange = (event) => {
425
+ const target = event.target
426
+ if (!(target instanceof HTMLInputElement)) return
427
+ const hook = target.getAttribute('data-ui')
428
+ if (hook !== 'select-all' && hook !== 'row-select') return
429
+ const table = target.closest('[data-ui="table"]')
430
+ if (!table) return
431
+ if (hook === 'select-all') {
432
+ for (const input of table.querySelectorAll('[data-ui="row-select"]')) {
433
+ if (input instanceof HTMLInputElement && !input.disabled) input.checked = target.checked
434
+ }
435
+ }
436
+ syncSelection(table)
437
+ }
438
+ for (const table of root.querySelectorAll('[data-ui="table"]')) {
439
+ if (table.querySelector('[data-ui="row-select"]')) syncSelection(table)
440
+ }
441
+ document.addEventListener('change', onSelectionChange)
442
+
352
443
  /** @param {MouseEvent} event */
353
444
  const onDocumentClick = (event) => {
354
445
  const target = event.target
355
446
  if (!(target instanceof Node)) return
356
447
  for (const menu of root.querySelectorAll('[data-ui="menu"][open]')) {
357
- if (menu instanceof HTMLDetailsElement && !menu.contains(target)) menu.open = false
448
+ if (!(menu instanceof HTMLDetailsElement)) continue
449
+ const item = target instanceof Element ? target.closest('[data-ui="menu-item"]') : null
450
+ if (!menu.contains(target) || (item && item.getAttribute('aria-disabled') !== 'true')) menu.open = false
358
451
  }
359
452
  }
360
453
  document.addEventListener('keydown', onKeydown)
@@ -363,6 +456,8 @@ export const attachDesignSystemInteractions = (root = document) => {
363
456
  return () => {
364
457
  document.removeEventListener('keydown', onKeydown)
365
458
  document.removeEventListener('click', onDocumentClick)
459
+ document.removeEventListener('change', onSelectionChange)
460
+ for (const cleanup of menuCleanups) cleanup()
366
461
  navigationMedia.removeEventListener('change', onNavigationMediaChange)
367
462
  for (const cleanup of navigationCleanups) cleanup()
368
463
  if (priorNavigationOpen === undefined) delete navigationRoot.dataset.kvNavigationOpen