@joanroucoux/cairn-ui 0.7.2 → 0.8.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.
Files changed (110) hide show
  1. package/CHANGELOG.md +59 -0
  2. package/fesm2022/joanroucoux-cairn-ui-action-bar.mjs +54 -0
  3. package/fesm2022/joanroucoux-cairn-ui-action-bar.mjs.map +1 -0
  4. package/fesm2022/joanroucoux-cairn-ui-alert.mjs +129 -0
  5. package/fesm2022/joanroucoux-cairn-ui-alert.mjs.map +1 -0
  6. package/fesm2022/joanroucoux-cairn-ui-amount.mjs +114 -0
  7. package/fesm2022/joanroucoux-cairn-ui-amount.mjs.map +1 -0
  8. package/fesm2022/joanroucoux-cairn-ui-async.mjs +282 -0
  9. package/fesm2022/joanroucoux-cairn-ui-async.mjs.map +1 -0
  10. package/fesm2022/joanroucoux-cairn-ui-avatar.mjs +71 -0
  11. package/fesm2022/joanroucoux-cairn-ui-avatar.mjs.map +1 -0
  12. package/fesm2022/joanroucoux-cairn-ui-back-link.mjs +79 -0
  13. package/fesm2022/joanroucoux-cairn-ui-back-link.mjs.map +1 -0
  14. package/fesm2022/joanroucoux-cairn-ui-badge.mjs +48 -0
  15. package/fesm2022/joanroucoux-cairn-ui-badge.mjs.map +1 -0
  16. package/fesm2022/joanroucoux-cairn-ui-button.mjs +128 -0
  17. package/fesm2022/joanroucoux-cairn-ui-button.mjs.map +1 -0
  18. package/fesm2022/joanroucoux-cairn-ui-card.mjs +146 -0
  19. package/fesm2022/joanroucoux-cairn-ui-card.mjs.map +1 -0
  20. package/fesm2022/joanroucoux-cairn-ui-choice-chips.mjs +172 -0
  21. package/fesm2022/joanroucoux-cairn-ui-choice-chips.mjs.map +1 -0
  22. package/fesm2022/joanroucoux-cairn-ui-control.mjs +18 -0
  23. package/fesm2022/joanroucoux-cairn-ui-control.mjs.map +1 -0
  24. package/fesm2022/joanroucoux-cairn-ui-delta.mjs +103 -0
  25. package/fesm2022/joanroucoux-cairn-ui-delta.mjs.map +1 -0
  26. package/fesm2022/joanroucoux-cairn-ui-dialog.mjs +626 -0
  27. package/fesm2022/joanroucoux-cairn-ui-dialog.mjs.map +1 -0
  28. package/fesm2022/joanroucoux-cairn-ui-donut.mjs +347 -0
  29. package/fesm2022/joanroucoux-cairn-ui-donut.mjs.map +1 -0
  30. package/fesm2022/joanroucoux-cairn-ui-empty.mjs +47 -0
  31. package/fesm2022/joanroucoux-cairn-ui-empty.mjs.map +1 -0
  32. package/fesm2022/joanroucoux-cairn-ui-external-link.mjs +65 -0
  33. package/fesm2022/joanroucoux-cairn-ui-external-link.mjs.map +1 -0
  34. package/fesm2022/joanroucoux-cairn-ui-fact.mjs +99 -0
  35. package/fesm2022/joanroucoux-cairn-ui-fact.mjs.map +1 -0
  36. package/fesm2022/joanroucoux-cairn-ui-field.mjs +232 -0
  37. package/fesm2022/joanroucoux-cairn-ui-field.mjs.map +1 -0
  38. package/fesm2022/joanroucoux-cairn-ui-filter-chips.mjs +89 -0
  39. package/fesm2022/joanroucoux-cairn-ui-filter-chips.mjs.map +1 -0
  40. package/fesm2022/joanroucoux-cairn-ui-input.mjs +90 -0
  41. package/fesm2022/joanroucoux-cairn-ui-input.mjs.map +1 -0
  42. package/fesm2022/joanroucoux-cairn-ui-line-chart.mjs +844 -0
  43. package/fesm2022/joanroucoux-cairn-ui-line-chart.mjs.map +1 -0
  44. package/fesm2022/joanroucoux-cairn-ui-menu.mjs +241 -0
  45. package/fesm2022/joanroucoux-cairn-ui-menu.mjs.map +1 -0
  46. package/fesm2022/joanroucoux-cairn-ui-meter.mjs +86 -0
  47. package/fesm2022/joanroucoux-cairn-ui-meter.mjs.map +1 -0
  48. package/fesm2022/joanroucoux-cairn-ui-motion.mjs +415 -0
  49. package/fesm2022/joanroucoux-cairn-ui-motion.mjs.map +1 -0
  50. package/fesm2022/joanroucoux-cairn-ui-nav-item.mjs +45 -0
  51. package/fesm2022/joanroucoux-cairn-ui-nav-item.mjs.map +1 -0
  52. package/fesm2022/joanroucoux-cairn-ui-row.mjs +164 -0
  53. package/fesm2022/joanroucoux-cairn-ui-row.mjs.map +1 -0
  54. package/fesm2022/joanroucoux-cairn-ui-segmented.mjs +165 -0
  55. package/fesm2022/joanroucoux-cairn-ui-segmented.mjs.map +1 -0
  56. package/fesm2022/joanroucoux-cairn-ui-select.mjs +69 -0
  57. package/fesm2022/joanroucoux-cairn-ui-select.mjs.map +1 -0
  58. package/fesm2022/joanroucoux-cairn-ui-skeleton.mjs +91 -0
  59. package/fesm2022/joanroucoux-cairn-ui-skeleton.mjs.map +1 -0
  60. package/fesm2022/joanroucoux-cairn-ui-stale-link.mjs +43 -0
  61. package/fesm2022/joanroucoux-cairn-ui-stale-link.mjs.map +1 -0
  62. package/fesm2022/joanroucoux-cairn-ui-stat.mjs +96 -0
  63. package/fesm2022/joanroucoux-cairn-ui-stat.mjs.map +1 -0
  64. package/fesm2022/joanroucoux-cairn-ui-switch.mjs +37 -0
  65. package/fesm2022/joanroucoux-cairn-ui-switch.mjs.map +1 -0
  66. package/fesm2022/joanroucoux-cairn-ui-tab-bar.mjs +75 -0
  67. package/fesm2022/joanroucoux-cairn-ui-tab-bar.mjs.map +1 -0
  68. package/fesm2022/joanroucoux-cairn-ui-table.mjs +321 -0
  69. package/fesm2022/joanroucoux-cairn-ui-table.mjs.map +1 -0
  70. package/fesm2022/joanroucoux-cairn-ui-toast.mjs +153 -0
  71. package/fesm2022/joanroucoux-cairn-ui-toast.mjs.map +1 -0
  72. package/fesm2022/joanroucoux-cairn-ui.mjs +0 -5462
  73. package/fesm2022/joanroucoux-cairn-ui.mjs.map +1 -1
  74. package/package.json +141 -1
  75. package/types/joanroucoux-cairn-ui-action-bar.d.ts +22 -0
  76. package/types/joanroucoux-cairn-ui-alert.d.ts +23 -0
  77. package/types/joanroucoux-cairn-ui-amount.d.ts +45 -0
  78. package/types/joanroucoux-cairn-ui-async.d.ts +58 -0
  79. package/types/joanroucoux-cairn-ui-avatar.d.ts +35 -0
  80. package/types/joanroucoux-cairn-ui-back-link.d.ts +22 -0
  81. package/types/joanroucoux-cairn-ui-badge.d.ts +23 -0
  82. package/types/joanroucoux-cairn-ui-button.d.ts +29 -0
  83. package/types/joanroucoux-cairn-ui-card.d.ts +36 -0
  84. package/types/joanroucoux-cairn-ui-choice-chips.d.ts +46 -0
  85. package/types/joanroucoux-cairn-ui-control.d.ts +27 -0
  86. package/types/joanroucoux-cairn-ui-delta.d.ts +38 -0
  87. package/types/joanroucoux-cairn-ui-dialog.d.ts +72 -0
  88. package/types/joanroucoux-cairn-ui-donut.d.ts +59 -0
  89. package/types/joanroucoux-cairn-ui-empty.d.ts +19 -0
  90. package/types/joanroucoux-cairn-ui-external-link.d.ts +15 -0
  91. package/types/joanroucoux-cairn-ui-fact.d.ts +44 -0
  92. package/types/joanroucoux-cairn-ui-field.d.ts +84 -0
  93. package/types/joanroucoux-cairn-ui-filter-chips.d.ts +28 -0
  94. package/types/joanroucoux-cairn-ui-input.d.ts +51 -0
  95. package/types/joanroucoux-cairn-ui-line-chart.d.ts +114 -0
  96. package/types/joanroucoux-cairn-ui-menu.d.ts +66 -0
  97. package/types/joanroucoux-cairn-ui-meter.d.ts +30 -0
  98. package/types/joanroucoux-cairn-ui-motion.d.ts +124 -0
  99. package/types/joanroucoux-cairn-ui-nav-item.d.ts +21 -0
  100. package/types/joanroucoux-cairn-ui-row.d.ts +78 -0
  101. package/types/joanroucoux-cairn-ui-segmented.d.ts +36 -0
  102. package/types/joanroucoux-cairn-ui-select.d.ts +23 -0
  103. package/types/joanroucoux-cairn-ui-skeleton.d.ts +26 -0
  104. package/types/joanroucoux-cairn-ui-stale-link.d.ts +24 -0
  105. package/types/joanroucoux-cairn-ui-stat.d.ts +32 -0
  106. package/types/joanroucoux-cairn-ui-switch.d.ts +17 -0
  107. package/types/joanroucoux-cairn-ui-tab-bar.d.ts +31 -0
  108. package/types/joanroucoux-cairn-ui-table.d.ts +139 -0
  109. package/types/joanroucoux-cairn-ui-toast.d.ts +51 -0
  110. package/types/joanroucoux-cairn-ui.d.ts +1 -1440
@@ -0,0 +1 @@
1
+ {"version":3,"file":"joanroucoux-cairn-ui-stale-link.mjs","sources":["../../../projects/ui/stale-link/stale-link.ts","../../../projects/ui/stale-link/joanroucoux-cairn-ui-stale-link.ts"],"sourcesContent":["import { Directive, booleanAttribute, computed, input } from '@angular/core';\n\n/** Available stale link sizes. `StaleLinkSize` is derived from this tuple. */\nexport const STALE_LINK_SIZES = ['caption', 'label'] as const;\nexport type StaleLinkSize = (typeof STALE_LINK_SIZES)[number];\n\nconst BASE_CLASSES =\n \"relative inline-flex items-center gap-0.5 rounded-[4px] font-medium text-(--stale) hover:underline underline-offset-3 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-(--ring) before:absolute before:inset-x-0 before:top-1/2 before:h-11 pointer-fine:before:h-10 before:-translate-y-1/2 before:content-['']\";\n\nconst SIZE_CLASSES: Record<StaleLinkSize, string> = {\n caption: 'text-caption',\n label: 'text-label',\n};\n\nconst CHEVRON_CLASSES =\n \"after:size-4 after:flex-none after:bg-current after:content-[''] after:mask-center after:mask-no-repeat after:mask-[url(data:image/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2024%2024%27%20fill%3D%27none%27%20stroke%3D%27black%27%20stroke-width%3D%271.75%27%20stroke-linecap%3D%27round%27%20stroke-linejoin%3D%27round%27%3E%3Cpath%20d%3D%27m9%2018%206-6-6-6%27%2F%3E%3C%2Fsvg%3E)]\";\n\n/**\n * Link in the stale tone, for a caption about data that is late or left out of a total, such as\n * \"1 ligne sans cours, non comptée\". Weight 500, underlined on hover, with an optional trailing\n * chevron. `size` is `caption` (12/17, the default) or `label` (14/20, the dashboard total's\n * \"1 cours en retard\").\n *\n * @example\n * <a uiStaleLink chevron size=\"label\" routerLink=\"/holdings\">1 cours en retard</a>\n */\n@Directive({\n selector: 'a[uiStaleLink]',\n host: { '[class]': 'classes()' },\n})\nexport class UiStaleLink {\n readonly chevron = input(false, { transform: booleanAttribute });\n readonly size = input<StaleLinkSize>('caption');\n\n protected readonly classes = computed(\n () => `${BASE_CLASSES} ${SIZE_CLASSES[this.size()]}${this.chevron() ? ` ${CHEVRON_CLASSES}` : ''}`,\n );\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;AAEA;MACa,gBAAgB,GAAG,CAAC,SAAS,EAAE,OAAO;AAGnD,MAAM,YAAY,GAChB,8UAA8U;AAEhV,MAAM,YAAY,GAAkC;AAClD,IAAA,OAAO,EAAE,cAAc;AACvB,IAAA,KAAK,EAAE,YAAY;CACpB;AAED,MAAM,eAAe,GACnB,4aAA4a;AAE9a;;;;;;;;AAQG;MAKU,WAAW,CAAA;IACb,OAAO,GAAG,KAAK,CAAC,KAAK,+EAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;IACvD,IAAI,GAAG,KAAK,CAAgB,SAAS;6EAAC;AAE5B,IAAA,OAAO,GAAG,QAAQ,CACnC,MAAM,CAAA,EAAG,YAAY,CAAA,CAAA,EAAI,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAA,EAAG,IAAI,CAAC,OAAO,EAAE,GAAG,CAAA,CAAA,EAAI,eAAe,CAAA,CAAE,GAAG,EAAE,CAAA,CAAE;gFACnG;uGANU,WAAW,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAX,WAAW,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,OAAA,EAAA,WAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;2FAAX,WAAW,EAAA,UAAA,EAAA,CAAA;kBAJvB,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,gBAAgB;AAC1B,oBAAA,IAAI,EAAE,EAAE,SAAS,EAAE,WAAW,EAAE;AACjC,iBAAA;;;AC7BD;;AAEG;;;;"}
@@ -0,0 +1,96 @@
1
+ import * as i0 from '@angular/core';
2
+ import { input, computed, Component } from '@angular/core';
3
+
4
+ /** Available stat sizes. `StatSize` is derived from this tuple. */
5
+ const STAT_SIZES = ['hero', 'tile'];
6
+ const VALUE_CLASSES = {
7
+ hero: 'text-display font-semibold tracking-(--tracking-display) text-(--foreground)',
8
+ tile: 'text-title font-semibold tabular-nums text-(--foreground)',
9
+ };
10
+ const LABEL_CLASSES = {
11
+ hero: 'text-label font-medium text-(--muted-foreground)',
12
+ tile: 'text-label font-normal text-(--muted-foreground)',
13
+ };
14
+ const STACK_CLASSES = {
15
+ hero: 'flex flex-col gap-1',
16
+ tile: 'flex flex-col gap-0.5',
17
+ };
18
+ /**
19
+ * Label, figure and a named period of change, at two sizes: a `hero` for a screen's single
20
+ * headline number, or a smaller `tile` repeated in a grid. The figure itself, its delta and its
21
+ * caption are all projected, so the component carries no formatting and no currency of its own.
22
+ *
23
+ * The `hero` size never sets `tabular-nums` on the figure: a lone headline number reads better
24
+ * with its digits at their natural width, unlike a column of aligned figures.
25
+ *
26
+ * @example
27
+ * <ui-stat label="Net worth" size="hero">
28
+ * <span uiStatValue>128,656 EUR</span>
29
+ * <ui-delta uiStatDelta [value]="dayChange()" unknownLabel="Not available">+316.54 EUR</ui-delta>
30
+ * <span uiStatCaption>today</span>
31
+ * </ui-stat>
32
+ */
33
+ class UiStat {
34
+ label = input.required(/* @ts-ignore */
35
+ ...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
36
+ size = input('tile', /* @ts-ignore */
37
+ ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
38
+ labelClasses = computed(() => LABEL_CLASSES[this.size()], /* @ts-ignore */
39
+ ...(ngDevMode ? [{ debugName: "labelClasses" }] : /* istanbul ignore next */ []));
40
+ stackClasses = computed(() => STACK_CLASSES[this.size()], /* @ts-ignore */
41
+ ...(ngDevMode ? [{ debugName: "stackClasses" }] : /* istanbul ignore next */ []));
42
+ valueClasses = computed(() => VALUE_CLASSES[this.size()], /* @ts-ignore */
43
+ ...(ngDevMode ? [{ debugName: "valueClasses" }] : /* istanbul ignore next */ []));
44
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: UiStat, deps: [], target: i0.ɵɵFactoryTarget.Component });
45
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.1.7", type: UiStat, isStandalone: true, selector: "ui-stat", inputs: { label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: true, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
46
+ <div class="flex items-start justify-between gap-4">
47
+ <div [class]="stackClasses()">
48
+ <dl [class]="stackClasses()">
49
+ <dt [class]="labelClasses()">{{ label() }}</dt>
50
+ <dd [class]="valueClasses()">
51
+ <ng-content select="[uiStatValue]" />
52
+ </dd>
53
+ </dl>
54
+
55
+ <div class="text-label flex flex-wrap items-center gap-x-1.5 gap-y-1 text-(--muted-foreground)">
56
+ <ng-content select="[uiStatDelta]" />
57
+ <ng-content select="[uiStatCaption]" />
58
+ </div>
59
+ </div>
60
+
61
+ <ng-content select="[uiStatAside]" />
62
+ </div>
63
+ `, isInline: true });
64
+ }
65
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: UiStat, decorators: [{
66
+ type: Component,
67
+ args: [{
68
+ selector: 'ui-stat',
69
+ template: `
70
+ <div class="flex items-start justify-between gap-4">
71
+ <div [class]="stackClasses()">
72
+ <dl [class]="stackClasses()">
73
+ <dt [class]="labelClasses()">{{ label() }}</dt>
74
+ <dd [class]="valueClasses()">
75
+ <ng-content select="[uiStatValue]" />
76
+ </dd>
77
+ </dl>
78
+
79
+ <div class="text-label flex flex-wrap items-center gap-x-1.5 gap-y-1 text-(--muted-foreground)">
80
+ <ng-content select="[uiStatDelta]" />
81
+ <ng-content select="[uiStatCaption]" />
82
+ </div>
83
+ </div>
84
+
85
+ <ng-content select="[uiStatAside]" />
86
+ </div>
87
+ `,
88
+ }]
89
+ }], propDecorators: { label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: true }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }] } });
90
+
91
+ /**
92
+ * Generated bundle index. Do not edit.
93
+ */
94
+
95
+ export { STAT_SIZES, UiStat };
96
+ //# sourceMappingURL=joanroucoux-cairn-ui-stat.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"joanroucoux-cairn-ui-stat.mjs","sources":["../../../projects/ui/stat/stat.ts","../../../projects/ui/stat/joanroucoux-cairn-ui-stat.ts"],"sourcesContent":["import { Component, computed, input } from '@angular/core';\n\n/** Available stat sizes. `StatSize` is derived from this tuple. */\nexport const STAT_SIZES = ['hero', 'tile'] as const;\nexport type StatSize = (typeof STAT_SIZES)[number];\n\nconst VALUE_CLASSES: Record<StatSize, string> = {\n hero: 'text-display font-semibold tracking-(--tracking-display) text-(--foreground)',\n tile: 'text-title font-semibold tabular-nums text-(--foreground)',\n};\n\nconst LABEL_CLASSES: Record<StatSize, string> = {\n hero: 'text-label font-medium text-(--muted-foreground)',\n tile: 'text-label font-normal text-(--muted-foreground)',\n};\n\nconst STACK_CLASSES: Record<StatSize, string> = {\n hero: 'flex flex-col gap-1',\n tile: 'flex flex-col gap-0.5',\n};\n\n/**\n * Label, figure and a named period of change, at two sizes: a `hero` for a screen's single\n * headline number, or a smaller `tile` repeated in a grid. The figure itself, its delta and its\n * caption are all projected, so the component carries no formatting and no currency of its own.\n *\n * The `hero` size never sets `tabular-nums` on the figure: a lone headline number reads better\n * with its digits at their natural width, unlike a column of aligned figures.\n *\n * @example\n * <ui-stat label=\"Net worth\" size=\"hero\">\n * <span uiStatValue>128,656 EUR</span>\n * <ui-delta uiStatDelta [value]=\"dayChange()\" unknownLabel=\"Not available\">+316.54 EUR</ui-delta>\n * <span uiStatCaption>today</span>\n * </ui-stat>\n */\n@Component({\n selector: 'ui-stat',\n template: `\n <div class=\"flex items-start justify-between gap-4\">\n <div [class]=\"stackClasses()\">\n <dl [class]=\"stackClasses()\">\n <dt [class]=\"labelClasses()\">{{ label() }}</dt>\n <dd [class]=\"valueClasses()\">\n <ng-content select=\"[uiStatValue]\" />\n </dd>\n </dl>\n\n <div class=\"text-label flex flex-wrap items-center gap-x-1.5 gap-y-1 text-(--muted-foreground)\">\n <ng-content select=\"[uiStatDelta]\" />\n <ng-content select=\"[uiStatCaption]\" />\n </div>\n </div>\n\n <ng-content select=\"[uiStatAside]\" />\n </div>\n `,\n})\nexport class UiStat {\n readonly label = input.required<string>();\n readonly size = input<StatSize>('tile');\n\n protected readonly labelClasses = computed(() => LABEL_CLASSES[this.size()]);\n\n protected readonly stackClasses = computed(() => STACK_CLASSES[this.size()]);\n\n protected readonly valueClasses = computed(() => VALUE_CLASSES[this.size()]);\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;AAEA;MACa,UAAU,GAAG,CAAC,MAAM,EAAE,MAAM;AAGzC,MAAM,aAAa,GAA6B;AAC9C,IAAA,IAAI,EAAE,8EAA8E;AACpF,IAAA,IAAI,EAAE,2DAA2D;CAClE;AAED,MAAM,aAAa,GAA6B;AAC9C,IAAA,IAAI,EAAE,kDAAkD;AACxD,IAAA,IAAI,EAAE,kDAAkD;CACzD;AAED,MAAM,aAAa,GAA6B;AAC9C,IAAA,IAAI,EAAE,qBAAqB;AAC3B,IAAA,IAAI,EAAE,uBAAuB;CAC9B;AAED;;;;;;;;;;;;;;AAcG;MAuBU,MAAM,CAAA;IACR,KAAK,GAAG,KAAK,CAAC,QAAQ;8EAAU;IAChC,IAAI,GAAG,KAAK,CAAW,MAAM;6EAAC;AAEpB,IAAA,YAAY,GAAG,QAAQ,CAAC,MAAM,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;qFAAC;AAEzD,IAAA,YAAY,GAAG,QAAQ,CAAC,MAAM,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;qFAAC;AAEzD,IAAA,YAAY,GAAG,QAAQ,CAAC,MAAM,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;qFAAC;uGARjE,MAAM,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAN,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAM,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EApBP;;;;;;;;;;;;;;;;;;AAkBT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA;;2FAEU,MAAM,EAAA,UAAA,EAAA,CAAA;kBAtBlB,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,SAAS;AACnB,oBAAA,QAAQ,EAAE;;;;;;;;;;;;;;;;;;AAkBT,EAAA,CAAA;AACF,iBAAA;;;ACzDD;;AAEG;;;;"}
@@ -0,0 +1,37 @@
1
+ import * as i0 from '@angular/core';
2
+ import { Directive } from '@angular/core';
3
+ import { holdTransitionsUntilRendered } from '@joanroucoux/cairn-ui/motion';
4
+
5
+ const CLASSES = "relative shrink-0 w-[51px] h-[31px] pointer-fine:w-10 pointer-fine:h-6 appearance-none cursor-pointer rounded-pill bg-(--muted) checked:bg-(--primary) transition-[background-color] duration-(--duration-fast) ease-out disabled:pointer-events-none disabled:opacity-40 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-(--ring) before:absolute before:inset-x-0 before:top-1/2 before:-translate-y-1/2 before:h-(--row-min) before:content-[''] after:absolute after:top-0.5 after:left-0.5 after:size-[27px] pointer-fine:after:size-5 after:rounded-pill after:bg-(--card) after:shadow-[0_1px_3px_rgb(0_0_0/0.2)] after:transition-transform after:duration-(--duration-fast) after:ease-out after:content-[''] checked:after:translate-x-[20px] pointer-fine:checked:after:translate-x-4";
6
+ /**
7
+ * Native checkbox styled as an iOS-style switch, exposed to assistive technology as `role="switch"`.
8
+ * 51 by 31 on touch, 40 by 24 with a mouse.
9
+ *
10
+ * @example
11
+ * <input type="checkbox" uiSwitch [checked]="hidden()" (change)="toggle()" aria-label="Hide amounts" />
12
+ */
13
+ class UiSwitch {
14
+ classes = CLASSES;
15
+ constructor() {
16
+ holdTransitionsUntilRendered();
17
+ }
18
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: UiSwitch, deps: [], target: i0.ɵɵFactoryTarget.Directive });
19
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.1.7", type: UiSwitch, isStandalone: true, selector: "input[type=checkbox][uiSwitch]", host: { attributes: { "role": "switch" }, properties: { "class": "classes" } }, ngImport: i0 });
20
+ }
21
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: UiSwitch, decorators: [{
22
+ type: Directive,
23
+ args: [{
24
+ selector: 'input[type=checkbox][uiSwitch]',
25
+ host: {
26
+ role: 'switch',
27
+ '[class]': 'classes',
28
+ },
29
+ }]
30
+ }], ctorParameters: () => [] });
31
+
32
+ /**
33
+ * Generated bundle index. Do not edit.
34
+ */
35
+
36
+ export { UiSwitch };
37
+ //# sourceMappingURL=joanroucoux-cairn-ui-switch.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"joanroucoux-cairn-ui-switch.mjs","sources":["../../../projects/ui/switch/switch.ts","../../../projects/ui/switch/joanroucoux-cairn-ui-switch.ts"],"sourcesContent":["import { Directive } from '@angular/core';\n\nimport { holdTransitionsUntilRendered } from '@joanroucoux/cairn-ui/motion';\n\nconst CLASSES =\n \"relative shrink-0 w-[51px] h-[31px] pointer-fine:w-10 pointer-fine:h-6 appearance-none cursor-pointer rounded-pill bg-(--muted) checked:bg-(--primary) transition-[background-color] duration-(--duration-fast) ease-out disabled:pointer-events-none disabled:opacity-40 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-(--ring) before:absolute before:inset-x-0 before:top-1/2 before:-translate-y-1/2 before:h-(--row-min) before:content-[''] after:absolute after:top-0.5 after:left-0.5 after:size-[27px] pointer-fine:after:size-5 after:rounded-pill after:bg-(--card) after:shadow-[0_1px_3px_rgb(0_0_0/0.2)] after:transition-transform after:duration-(--duration-fast) after:ease-out after:content-[''] checked:after:translate-x-[20px] pointer-fine:checked:after:translate-x-4\";\n\n/**\n * Native checkbox styled as an iOS-style switch, exposed to assistive technology as `role=\"switch\"`.\n * 51 by 31 on touch, 40 by 24 with a mouse.\n *\n * @example\n * <input type=\"checkbox\" uiSwitch [checked]=\"hidden()\" (change)=\"toggle()\" aria-label=\"Hide amounts\" />\n */\n@Directive({\n selector: 'input[type=checkbox][uiSwitch]',\n host: {\n role: 'switch',\n '[class]': 'classes',\n },\n})\nexport class UiSwitch {\n protected readonly classes = CLASSES;\n\n constructor() {\n holdTransitionsUntilRendered();\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;AAIA,MAAM,OAAO,GACX,+xBAA+xB;AAEjyB;;;;;;AAMG;MAQU,QAAQ,CAAA;IACA,OAAO,GAAG,OAAO;AAEpC,IAAA,WAAA,GAAA;AACE,QAAA,4BAA4B,EAAE;IAChC;uGALW,QAAQ,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAR,QAAQ,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,gCAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,EAAA,UAAA,EAAA,EAAA,OAAA,EAAA,SAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;2FAAR,QAAQ,EAAA,UAAA,EAAA,CAAA;kBAPpB,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,gCAAgC;AAC1C,oBAAA,IAAI,EAAE;AACJ,wBAAA,IAAI,EAAE,QAAQ;AACd,wBAAA,SAAS,EAAE,SAAS;AACrB,qBAAA;AACF,iBAAA;;;ACpBD;;AAEG;;;;"}
@@ -0,0 +1,75 @@
1
+ import { DOCUMENT } from '@angular/common';
2
+ import * as i0 from '@angular/core';
3
+ import { inject, DestroyRef, Component, input, booleanAttribute, computed } from '@angular/core';
4
+
5
+ const HEIGHT_PROPERTY = '--tab-bar-height';
6
+ const HEIGHT = 'calc(52px + env(safe-area-inset-bottom))';
7
+ const TAB_CLASSES = 'flex h-[52px] flex-col items-center justify-center gap-[3px] touch-manipulation select-none transition-transform duration-(--duration-press) ease-out active:scale-(--press-scale) focus-visible:outline-2 focus-visible:-outline-offset-2 focus-visible:outline-(--ring)';
8
+ const INACTIVE_TAB_CLASSES = 'font-medium text-(--muted-foreground)';
9
+ const ACTIVE_TAB_CLASSES = 'font-semibold text-(--foreground)';
10
+ /**
11
+ * Bottom navigation bar for iPhone: 52px of tabs plus the home indicator's safe area. While it is on the
12
+ * page it publishes that height as `--tab-bar-height` on the root element, which `ui-action-bar` and
13
+ * `ui-toaster` sit above; use it rather than restating 52px for anything that must clear the bar.
14
+ *
15
+ * @example
16
+ * <nav ui-tab-bar>
17
+ * <a ui-tab [active]="url === '/'" routerLink="/"><lucide-icon tabIcon name="house" />Portfolio</a>
18
+ * </nav>
19
+ */
20
+ class UiTabBar {
21
+ constructor() {
22
+ const root = inject(DOCUMENT).documentElement;
23
+ root.style.setProperty(HEIGHT_PROPERTY, HEIGHT);
24
+ inject(DestroyRef).onDestroy(() => root.style.removeProperty(HEIGHT_PROPERTY));
25
+ }
26
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: UiTabBar, deps: [], target: i0.ɵɵFactoryTarget.Component });
27
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.1.7", type: UiTabBar, isStandalone: true, selector: "nav[ui-tab-bar]", host: { classAttribute: "grid grid-flow-col auto-cols-fr items-stretch bg-(--background)/90 backdrop-blur [@media(prefers-reduced-transparency:reduce)]:bg-(--background) shadow-[inset_0_1px_0_var(--hairline)] pb-[env(safe-area-inset-bottom)]" }, ngImport: i0, template: '<ng-content />', isInline: true });
28
+ }
29
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: UiTabBar, decorators: [{
30
+ type: Component,
31
+ args: [{
32
+ selector: 'nav[ui-tab-bar]',
33
+ template: '<ng-content />',
34
+ host: {
35
+ class: 'grid grid-flow-col auto-cols-fr items-stretch bg-(--background)/90 backdrop-blur [@media(prefers-reduced-transparency:reduce)]:bg-(--background) shadow-[inset_0_1px_0_var(--hairline)] pb-[env(safe-area-inset-bottom)]',
36
+ },
37
+ }]
38
+ }], ctorParameters: () => [] });
39
+ /**
40
+ * One destination of `ui-tab-bar`.
41
+ *
42
+ * @example
43
+ * <a ui-tab active routerLink="/"><lucide-icon tabIcon name="house" />Portfolio</a>
44
+ */
45
+ class UiTab {
46
+ active = input(false, { ...(ngDevMode ? { debugName: "active" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
47
+ classes = computed(() => `${TAB_CLASSES} ${this.active() ? ACTIVE_TAB_CLASSES : INACTIVE_TAB_CLASSES}`, /* @ts-ignore */
48
+ ...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
49
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: UiTab, deps: [], target: i0.ɵɵFactoryTarget.Component });
50
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.1.7", type: UiTab, isStandalone: true, selector: "a[ui-tab]", inputs: { active: { classPropertyName: "active", publicName: "active", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "classes()", "attr.aria-current": "active() ? 'page' : null" } }, ngImport: i0, template: `
51
+ <span class="size-6" data-tab-icon><ng-content select="[tabIcon]" /></span>
52
+ <span class="text-caption leading-none" data-tab-label><ng-content /></span>
53
+ `, isInline: true });
54
+ }
55
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: UiTab, decorators: [{
56
+ type: Component,
57
+ args: [{
58
+ selector: 'a[ui-tab]',
59
+ template: `
60
+ <span class="size-6" data-tab-icon><ng-content select="[tabIcon]" /></span>
61
+ <span class="text-caption leading-none" data-tab-label><ng-content /></span>
62
+ `,
63
+ host: {
64
+ '[class]': 'classes()',
65
+ '[attr.aria-current]': "active() ? 'page' : null",
66
+ },
67
+ }]
68
+ }], propDecorators: { active: [{ type: i0.Input, args: [{ isSignal: true, alias: "active", required: false }] }] } });
69
+
70
+ /**
71
+ * Generated bundle index. Do not edit.
72
+ */
73
+
74
+ export { UiTab, UiTabBar };
75
+ //# sourceMappingURL=joanroucoux-cairn-ui-tab-bar.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"joanroucoux-cairn-ui-tab-bar.mjs","sources":["../../../projects/ui/tab-bar/tab-bar.ts","../../../projects/ui/tab-bar/joanroucoux-cairn-ui-tab-bar.ts"],"sourcesContent":["import { DOCUMENT } from '@angular/common';\nimport { Component, DestroyRef, booleanAttribute, computed, inject, input } from '@angular/core';\n\nconst HEIGHT_PROPERTY = '--tab-bar-height';\n\nconst HEIGHT = 'calc(52px + env(safe-area-inset-bottom))';\n\nconst TAB_CLASSES =\n 'flex h-[52px] flex-col items-center justify-center gap-[3px] touch-manipulation select-none transition-transform duration-(--duration-press) ease-out active:scale-(--press-scale) focus-visible:outline-2 focus-visible:-outline-offset-2 focus-visible:outline-(--ring)';\n\nconst INACTIVE_TAB_CLASSES = 'font-medium text-(--muted-foreground)';\n\nconst ACTIVE_TAB_CLASSES = 'font-semibold text-(--foreground)';\n\n/**\n * Bottom navigation bar for iPhone: 52px of tabs plus the home indicator's safe area. While it is on the\n * page it publishes that height as `--tab-bar-height` on the root element, which `ui-action-bar` and\n * `ui-toaster` sit above; use it rather than restating 52px for anything that must clear the bar.\n *\n * @example\n * <nav ui-tab-bar>\n * <a ui-tab [active]=\"url === '/'\" routerLink=\"/\"><lucide-icon tabIcon name=\"house\" />Portfolio</a>\n * </nav>\n */\n@Component({\n selector: 'nav[ui-tab-bar]',\n template: '<ng-content />',\n host: {\n class:\n 'grid grid-flow-col auto-cols-fr items-stretch bg-(--background)/90 backdrop-blur [@media(prefers-reduced-transparency:reduce)]:bg-(--background) shadow-[inset_0_1px_0_var(--hairline)] pb-[env(safe-area-inset-bottom)]',\n },\n})\nexport class UiTabBar {\n constructor() {\n const root = inject(DOCUMENT).documentElement;\n\n root.style.setProperty(HEIGHT_PROPERTY, HEIGHT);\n inject(DestroyRef).onDestroy(() => root.style.removeProperty(HEIGHT_PROPERTY));\n }\n}\n\n/**\n * One destination of `ui-tab-bar`.\n *\n * @example\n * <a ui-tab active routerLink=\"/\"><lucide-icon tabIcon name=\"house\" />Portfolio</a>\n */\n@Component({\n selector: 'a[ui-tab]',\n template: `\n <span class=\"size-6\" data-tab-icon><ng-content select=\"[tabIcon]\" /></span>\n <span class=\"text-caption leading-none\" data-tab-label><ng-content /></span>\n `,\n host: {\n '[class]': 'classes()',\n '[attr.aria-current]': \"active() ? 'page' : null\",\n },\n})\nexport class UiTab {\n readonly active = input(false, { transform: booleanAttribute });\n\n protected readonly classes = computed(\n () => `${TAB_CLASSES} ${this.active() ? ACTIVE_TAB_CLASSES : INACTIVE_TAB_CLASSES}`,\n );\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;AAGA,MAAM,eAAe,GAAG,kBAAkB;AAE1C,MAAM,MAAM,GAAG,0CAA0C;AAEzD,MAAM,WAAW,GACf,2QAA2Q;AAE7Q,MAAM,oBAAoB,GAAG,uCAAuC;AAEpE,MAAM,kBAAkB,GAAG,mCAAmC;AAE9D;;;;;;;;;AASG;MASU,QAAQ,CAAA;AACnB,IAAA,WAAA,GAAA;QACE,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,eAAe;QAE7C,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,eAAe,EAAE,MAAM,CAAC;AAC/C,QAAA,MAAM,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC;IAChF;uGANW,QAAQ,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAR,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,QAAQ,iUANT,gBAAgB,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA;;2FAMf,QAAQ,EAAA,UAAA,EAAA,CAAA;kBARpB,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,iBAAiB;AAC3B,oBAAA,QAAQ,EAAE,gBAAgB;AAC1B,oBAAA,IAAI,EAAE;AACJ,wBAAA,KAAK,EACH,0NAA0N;AAC7N,qBAAA;AACF,iBAAA;;AAUD;;;;;AAKG;MAYU,KAAK,CAAA;IACP,MAAM,GAAG,KAAK,CAAC,KAAK,8EAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;IAE5C,OAAO,GAAG,QAAQ,CACnC,MAAM,CAAA,EAAG,WAAW,CAAA,CAAA,EAAI,IAAI,CAAC,MAAM,EAAE,GAAG,kBAAkB,GAAG,oBAAoB,CAAA,CAAE;gFACpF;uGALU,KAAK,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAL,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAK,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,OAAA,EAAA,WAAA,EAAA,mBAAA,EAAA,0BAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EATN;;;AAGT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA;;2FAMU,KAAK,EAAA,UAAA,EAAA,CAAA;kBAXjB,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,WAAW;AACrB,oBAAA,QAAQ,EAAE;;;AAGT,EAAA,CAAA;AACD,oBAAA,IAAI,EAAE;AACJ,wBAAA,SAAS,EAAE,WAAW;AACtB,wBAAA,qBAAqB,EAAE,0BAA0B;AAClD,qBAAA;AACF,iBAAA;;;ACzDD;;AAEG;;;;"}
@@ -0,0 +1,321 @@
1
+ import * as i0 from '@angular/core';
2
+ import { input, booleanAttribute, computed, Directive, Component } from '@angular/core';
3
+ import { holdTransitionsUntilRendered } from '@joanroucoux/cairn-ui/motion';
4
+
5
+ /** Breakpoints a secondary column can be held back until. */
6
+ const CELL_BREAKPOINTS = ['md', 'lg'];
7
+ /** Body row heights. */
8
+ const TABLE_ROWS = ['48', '52', '60'];
9
+ const ROW_CLASSES = {
10
+ '48': '[--table-row:3rem]',
11
+ '52': '[--table-row:3.25rem]',
12
+ '60': '[--table-row:3.75rem]',
13
+ };
14
+ const FROM_CLASSES = {
15
+ md: 'hidden md:table-cell',
16
+ lg: 'hidden lg:table-cell',
17
+ };
18
+ const TH_CLASSES = 'h-[calc(var(--table-head)+var(--table-head-gap))] border-b-(length:--table-head-gap) border-transparent px-2 align-middle text-caption font-medium text-(--subtle-foreground) shadow-(--table-rule)';
19
+ const TD_CLASSES = 'h-(--table-row) px-2 align-middle text-body';
20
+ const NUMERIC_CLASSES = 'text-right tabular-nums whitespace-nowrap';
21
+ const TEXTUAL_CLASSES = 'text-left';
22
+ const PRIMARY_CLASSES = 'w-full max-w-0';
23
+ /**
24
+ * Styled native table. The rows and cells stay plain <tr> and <td>. `row` sets the height of every
25
+ * body row, `rule` draws or drops the hairline under the header, `spaced` leaves 4px between the
26
+ * header and the first row.
27
+ *
28
+ * @example
29
+ * <table uiTable row="60" [rule]="false">
30
+ */
31
+ class UiTable {
32
+ row = input('48', /* @ts-ignore */
33
+ ...(ngDevMode ? [{ debugName: "row" }] : /* istanbul ignore next */ []));
34
+ rule = input(true, { ...(ngDevMode ? { debugName: "rule" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
35
+ spaced = input(false, { ...(ngDevMode ? { debugName: "spaced" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
36
+ classes = computed(() => [
37
+ 'w-full border-separate border-spacing-0',
38
+ ROW_CLASSES[this.row()],
39
+ this.rule() ? '[--table-rule:inset_0_-1px_0_var(--hairline)]' : '[--table-rule:none]',
40
+ this.spaced() ? '[--table-head-gap:0.25rem]' : '[--table-head-gap:0px]',
41
+ ].join(' '), /* @ts-ignore */
42
+ ...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
43
+ constructor() {
44
+ holdTransitionsUntilRendered();
45
+ }
46
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: UiTable, deps: [], target: i0.ɵɵFactoryTarget.Directive });
47
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.1.7", type: UiTable, isStandalone: true, selector: "table[uiTable]", inputs: { row: { classPropertyName: "row", publicName: "row", isSignal: true, isRequired: false, transformFunction: null }, rule: { classPropertyName: "rule", publicName: "rule", isSignal: true, isRequired: false, transformFunction: null }, spaced: { classPropertyName: "spaced", publicName: "spaced", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "classes()" } }, ngImport: i0 });
48
+ }
49
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: UiTable, decorators: [{
50
+ type: Directive,
51
+ args: [{
52
+ selector: 'table[uiTable]',
53
+ host: {
54
+ '[class]': 'classes()',
55
+ },
56
+ }]
57
+ }], ctorParameters: () => [], propDecorators: { row: [{ type: i0.Input, args: [{ isSignal: true, alias: "row", required: false }] }], rule: [{ type: i0.Input, args: [{ isSignal: true, alias: "rule", required: false }] }], spaced: [{ type: i0.Input, args: [{ isSignal: true, alias: "spaced", required: false }] }] } });
58
+ /** Body of one group of rows: leaves a 4px tail after its last row. */
59
+ class UiGroup {
60
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: UiGroup, deps: [], target: i0.ɵɵFactoryTarget.Directive });
61
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.1.7", type: UiGroup, isStandalone: true, selector: "tbody[uiGroup]", host: { classAttribute: "after:table-row after:h-1 after:content-[\"\"]" }, ngImport: i0 });
62
+ }
63
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: UiGroup, decorators: [{
64
+ type: Directive,
65
+ args: [{
66
+ selector: 'tbody[uiGroup]',
67
+ host: { class: 'after:table-row after:h-1 after:content-[""]' },
68
+ }]
69
+ }] });
70
+ /**
71
+ * Body or group row. An ordinary row glows on hover and takes the soft fill when `selected`; an
72
+ * `interactive` row (one that opens something) also presses to the soft fill. A row with no action keeps a
73
+ * plain name: `<td uiTd primary class="truncate font-medium">`.
74
+ * `group` marks the row that holds a group band: it carries no hover state.
75
+ *
76
+ * @example
77
+ * <tr uiTr [selected]="open">...
78
+ * <tr uiTr group><td ui-group-cell name="Brokerage">...
79
+ */
80
+ class UiTr {
81
+ group = input(false, { ...(ngDevMode ? { debugName: "group" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
82
+ selected = input(false, { ...(ngDevMode ? { debugName: "selected" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
83
+ interactive = input(false, { ...(ngDevMode ? { debugName: "interactive" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
84
+ classes = computed(() => {
85
+ if (this.group()) {
86
+ return '';
87
+ }
88
+ return [
89
+ 'relative [&>td:first-child]:rounded-l-control [&>td:last-child]:rounded-r-control',
90
+ this.selected() ? '[&>td]:bg-(--soft)' : '',
91
+ 'hover:[&>td]:bg-(--glow) [&>td]:transition-colors [&>td]:duration-(--duration-fast) [&>td]:ease-out',
92
+ this.interactive()
93
+ ? 'active:[&>td]:bg-(--soft) transition-transform duration-(--duration-press) ease-out active:scale-(--press-scale)'
94
+ : '',
95
+ ]
96
+ .filter(Boolean)
97
+ .join(' ');
98
+ }, /* @ts-ignore */
99
+ ...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
100
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: UiTr, deps: [], target: i0.ɵɵFactoryTarget.Directive });
101
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.1.7", type: UiTr, isStandalone: true, selector: "tr[uiTr]", inputs: { group: { classPropertyName: "group", publicName: "group", isSignal: true, isRequired: false, transformFunction: null }, selected: { classPropertyName: "selected", publicName: "selected", isSignal: true, isRequired: false, transformFunction: null }, interactive: { classPropertyName: "interactive", publicName: "interactive", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "classes()", "attr.aria-selected": "selected() ? \"true\" : null" } }, ngImport: i0 });
102
+ }
103
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: UiTr, decorators: [{
104
+ type: Directive,
105
+ args: [{
106
+ selector: 'tr[uiTr]',
107
+ host: {
108
+ '[class]': 'classes()',
109
+ '[attr.aria-selected]': 'selected() ? "true" : null',
110
+ },
111
+ }]
112
+ }], propDecorators: { group: [{ type: i0.Input, args: [{ isSignal: true, alias: "group", required: false }] }], selected: [{ type: i0.Input, args: [{ isSignal: true, alias: "selected", required: false }] }], interactive: [{ type: i0.Input, args: [{ isSignal: true, alias: "interactive", required: false }] }] } });
113
+ const cellClasses = (base, numeric, primary, from, secondary) => {
114
+ const breakpoint = from ?? (secondary ? 'lg' : null);
115
+ return [
116
+ base,
117
+ numeric ? NUMERIC_CLASSES : TEXTUAL_CLASSES,
118
+ primary ? PRIMARY_CLASSES : '',
119
+ breakpoint ? FROM_CLASSES[breakpoint] : '',
120
+ ]
121
+ .filter(Boolean)
122
+ .join(' ');
123
+ };
124
+ /**
125
+ * Column header, centred in its 36px. `numeric` right-aligns and lines the digits up; `secondary`
126
+ * (or `from`) holds a column back until the viewport is wide enough for it; `primary` makes it
127
+ * the column that absorbs the free width and truncates; `tall` is a 40px header; `width` fixes the column width and keeps it from shrinking.
128
+ *
129
+ * @example
130
+ * <th uiTh numeric secondary width="108px">Quantity</th>
131
+ */
132
+ class UiTh {
133
+ width = input(null, /* @ts-ignore */
134
+ ...(ngDevMode ? [{ debugName: "width" }] : /* istanbul ignore next */ []));
135
+ numeric = input(false, { ...(ngDevMode ? { debugName: "numeric" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
136
+ primary = input(false, { ...(ngDevMode ? { debugName: "primary" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
137
+ secondary = input(false, { ...(ngDevMode ? { debugName: "secondary" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
138
+ tall = input(false, { ...(ngDevMode ? { debugName: "tall" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
139
+ from = input(null, /* @ts-ignore */
140
+ ...(ngDevMode ? [{ debugName: "from" }] : /* istanbul ignore next */ []));
141
+ classes = computed(() => cellClasses(`${this.tall() ? '[--table-head:2.5rem]' : '[--table-head:2.25rem]'} ${TH_CLASSES}`, this.numeric(), this.primary(), this.from(), this.secondary()), /* @ts-ignore */
142
+ ...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
143
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: UiTh, deps: [], target: i0.ɵɵFactoryTarget.Directive });
144
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.1.7", type: UiTh, isStandalone: true, selector: "th[uiTh]", inputs: { width: { classPropertyName: "width", publicName: "width", isSignal: true, isRequired: false, transformFunction: null }, numeric: { classPropertyName: "numeric", publicName: "numeric", isSignal: true, isRequired: false, transformFunction: null }, primary: { classPropertyName: "primary", publicName: "primary", isSignal: true, isRequired: false, transformFunction: null }, secondary: { classPropertyName: "secondary", publicName: "secondary", isSignal: true, isRequired: false, transformFunction: null }, tall: { classPropertyName: "tall", publicName: "tall", isSignal: true, isRequired: false, transformFunction: null }, from: { classPropertyName: "from", publicName: "from", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "classes()", "style.width": "width()", "style.min-width": "width()" } }, ngImport: i0 });
145
+ }
146
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: UiTh, decorators: [{
147
+ type: Directive,
148
+ args: [{
149
+ selector: 'th[uiTh]',
150
+ host: {
151
+ '[class]': 'classes()',
152
+ '[style.width]': 'width()',
153
+ '[style.min-width]': 'width()',
154
+ },
155
+ }]
156
+ }], propDecorators: { width: [{ type: i0.Input, args: [{ isSignal: true, alias: "width", required: false }] }], numeric: [{ type: i0.Input, args: [{ isSignal: true, alias: "numeric", required: false }] }], primary: [{ type: i0.Input, args: [{ isSignal: true, alias: "primary", required: false }] }], secondary: [{ type: i0.Input, args: [{ isSignal: true, alias: "secondary", required: false }] }], tall: [{ type: i0.Input, args: [{ isSignal: true, alias: "tall", required: false }] }], from: [{ type: i0.Input, args: [{ isSignal: true, alias: "from", required: false }] }] } });
157
+ /** Body cell. Same inputs as `UiTh` (bar `tall` and `width`), and they must be set on both to match. */
158
+ class UiTd {
159
+ numeric = input(false, { ...(ngDevMode ? { debugName: "numeric" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
160
+ primary = input(false, { ...(ngDevMode ? { debugName: "primary" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
161
+ secondary = input(false, { ...(ngDevMode ? { debugName: "secondary" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
162
+ from = input(null, /* @ts-ignore */
163
+ ...(ngDevMode ? [{ debugName: "from" }] : /* istanbul ignore next */ []));
164
+ classes = computed(() => cellClasses(TD_CLASSES, this.numeric(), this.primary(), this.from(), this.secondary()), /* @ts-ignore */
165
+ ...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
166
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: UiTd, deps: [], target: i0.ɵɵFactoryTarget.Directive });
167
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.1.7", type: UiTd, isStandalone: true, selector: "td[uiTd]", inputs: { numeric: { classPropertyName: "numeric", publicName: "numeric", isSignal: true, isRequired: false, transformFunction: null }, primary: { classPropertyName: "primary", publicName: "primary", isSignal: true, isRequired: false, transformFunction: null }, secondary: { classPropertyName: "secondary", publicName: "secondary", isSignal: true, isRequired: false, transformFunction: null }, from: { classPropertyName: "from", publicName: "from", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "classes()" } }, ngImport: i0 });
168
+ }
169
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: UiTd, decorators: [{
170
+ type: Directive,
171
+ args: [{
172
+ selector: 'td[uiTd]',
173
+ host: {
174
+ '[class]': 'classes()',
175
+ },
176
+ }]
177
+ }], propDecorators: { numeric: [{ type: i0.Input, args: [{ isSignal: true, alias: "numeric", required: false }] }], primary: [{ type: i0.Input, args: [{ isSignal: true, alias: "primary", required: false }] }], secondary: [{ type: i0.Input, args: [{ isSignal: true, alias: "secondary", required: false }] }], from: [{ type: i0.Input, args: [{ isSignal: true, alias: "from", required: false }] }] } });
178
+ /** Group band sizes. */
179
+ const GROUP_SIZES = ['md', 'lg'];
180
+ /**
181
+ * The band that opens a group of rows: name in 600 (a heading), meta beside it, the projected
182
+ * total pinned to the right. Spans the whole row through `colspan`.
183
+ *
184
+ * @example
185
+ * <tr uiTr group><td ui-group-cell colspan="4" name="Brokerage" meta="Savings plan">...total...</td></tr>
186
+ */
187
+ class UiGroupCell {
188
+ name = input.required(/* @ts-ignore */
189
+ ...(ngDevMode ? [{ debugName: "name" }] : /* istanbul ignore next */ []));
190
+ meta = input(/* @ts-ignore */
191
+ ...(ngDevMode ? [undefined, { debugName: "meta" }] : /* istanbul ignore next */ []));
192
+ size = input('md', /* @ts-ignore */
193
+ ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
194
+ hostClasses = computed(() => `px-0 ${this.size() === 'lg' ? 'pt-3' : 'pt-2.5'} pb-1 align-middle text-body`, /* @ts-ignore */
195
+ ...(ngDevMode ? [{ debugName: "hostClasses" }] : /* istanbul ignore next */ []));
196
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: UiGroupCell, deps: [], target: i0.ɵɵFactoryTarget.Component });
197
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.7", type: UiGroupCell, isStandalone: true, selector: "td[ui-group-cell]", inputs: { name: { classPropertyName: "name", publicName: "name", isSignal: true, isRequired: true, transformFunction: null }, meta: { classPropertyName: "meta", publicName: "meta", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "hostClasses()" } }, ngImport: i0, template: `
198
+ <div
199
+ class="rounded-control flex items-center justify-between gap-4 bg-(--muted) px-2"
200
+ [class]="size() === 'lg' ? 'min-h-12' : 'min-h-11'"
201
+ >
202
+ <div class="flex min-w-0 items-baseline gap-3">
203
+ <h2 class="text-body m-0 font-semibold whitespace-nowrap outline-none" data-group-heading tabindex="-1">
204
+ {{ name() }}
205
+ </h2>
206
+ @if (meta()) {
207
+ <span class="text-label truncate text-(--muted-foreground)">{{ meta() }}</span>
208
+ }
209
+ </div>
210
+ <span class="font-semibold whitespace-nowrap tabular-nums"><ng-content /></span>
211
+ </div>
212
+ `, isInline: true });
213
+ }
214
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: UiGroupCell, decorators: [{
215
+ type: Component,
216
+ args: [{
217
+ selector: 'td[ui-group-cell]',
218
+ host: {
219
+ '[class]': 'hostClasses()',
220
+ },
221
+ template: `
222
+ <div
223
+ class="rounded-control flex items-center justify-between gap-4 bg-(--muted) px-2"
224
+ [class]="size() === 'lg' ? 'min-h-12' : 'min-h-11'"
225
+ >
226
+ <div class="flex min-w-0 items-baseline gap-3">
227
+ <h2 class="text-body m-0 font-semibold whitespace-nowrap outline-none" data-group-heading tabindex="-1">
228
+ {{ name() }}
229
+ </h2>
230
+ @if (meta()) {
231
+ <span class="text-label truncate text-(--muted-foreground)">{{ meta() }}</span>
232
+ }
233
+ </div>
234
+ <span class="font-semibold whitespace-nowrap tabular-nums"><ng-content /></span>
235
+ </div>
236
+ `,
237
+ }]
238
+ }], propDecorators: { name: [{ type: i0.Input, args: [{ isSignal: true, alias: "name", required: true }] }], meta: [{ type: i0.Input, args: [{ isSignal: true, alias: "meta", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }] } });
239
+ /**
240
+ * Makes a link or button the way into its row. By default an invisible layer stretches over the
241
+ * whole row, so the row is one target for the pointer, the keyboard and a screen reader, and its
242
+ * focus ring wraps the row. With `[stretch]="false"` only the name is the
243
+ * target: it underlines on hover and takes its own ring. `current` marks the open line.
244
+ *
245
+ * @example
246
+ * <td uiTd primary><a uiRowLink href="/lines/42">Ferrari</a></td>
247
+ * <td uiTd primary><a uiRowLink [stretch]="false" href="/accounts/3">Brokerage</a></td>
248
+ */
249
+ class UiRowLink {
250
+ stretch = input(true, { ...(ngDevMode ? { debugName: "stretch" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
251
+ current = input(false, { ...(ngDevMode ? { debugName: "current" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
252
+ classes = computed(() => this.stretch()
253
+ ? 'block max-w-full truncate rounded-control text-left font-medium outline-none after:absolute after:inset-0 after:rounded-control after:content-[""] focus-visible:after:outline-2 focus-visible:after:-outline-offset-2 focus-visible:after:outline-(--ring)'
254
+ : 'block max-w-full truncate rounded-sm text-left font-medium underline-offset-[3px] outline-none hover:underline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-(--ring)', /* @ts-ignore */
255
+ ...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
256
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: UiRowLink, deps: [], target: i0.ɵɵFactoryTarget.Directive });
257
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.1.7", type: UiRowLink, isStandalone: true, selector: "a[uiRowLink], button[uiRowLink]", inputs: { stretch: { classPropertyName: "stretch", publicName: "stretch", isSignal: true, isRequired: false, transformFunction: null }, current: { classPropertyName: "current", publicName: "current", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "classes()", "attr.aria-current": "current() ? \"true\" : null" } }, ngImport: i0 });
258
+ }
259
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: UiRowLink, decorators: [{
260
+ type: Directive,
261
+ args: [{
262
+ selector: 'a[uiRowLink], button[uiRowLink]',
263
+ host: {
264
+ '[class]': 'classes()',
265
+ '[attr.aria-current]': 'current() ? "true" : null',
266
+ },
267
+ }]
268
+ }], propDecorators: { stretch: [{ type: i0.Input, args: [{ isSignal: true, alias: "stretch", required: false }] }], current: [{ type: i0.Input, args: [{ isSignal: true, alias: "current", required: false }] }] } });
269
+ /** A control in another cell of a stretched-link row: lifts it above the layer that covers the row. */
270
+ class UiRowAction {
271
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: UiRowAction, deps: [], target: i0.ɵɵFactoryTarget.Directive });
272
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.1.7", type: UiRowAction, isStandalone: true, selector: "[uiRowAction]", host: { classAttribute: "relative z-1" }, ngImport: i0 });
273
+ }
274
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: UiRowAction, decorators: [{
275
+ type: Directive,
276
+ args: [{
277
+ selector: '[uiRowAction]',
278
+ host: { class: 'relative z-1' },
279
+ }]
280
+ }] });
281
+ /** Tones of a subtitle: subtle (default), `--stale` at 500, or the color of the cell. */
282
+ const SUB_TONES = ['subtle', 'stale', 'inherit'];
283
+ const SUB_TONE_CLASSES = {
284
+ subtle: 'font-normal text-(--subtle-foreground)',
285
+ stale: 'font-medium text-(--stale)',
286
+ inherit: 'font-normal',
287
+ };
288
+ /**
289
+ * A second line under a cell's main text. `narrow` shows it only under 1024px, where it carries
290
+ * the quantity, average cost and quote that were held back. Its amounts go through `ui-amount`
291
+ * so they mask.
292
+ *
293
+ * @example
294
+ * <span uiCellSub narrow>10 × 421.26 € · cost 388.10 €</span>
295
+ * <span uiCellSub tone="stale">Quote of 24/09</span>
296
+ */
297
+ class UiCellSub {
298
+ narrow = input(false, { ...(ngDevMode ? { debugName: "narrow" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
299
+ tone = input('subtle', /* @ts-ignore */
300
+ ...(ngDevMode ? [{ debugName: "tone" }] : /* istanbul ignore next */ []));
301
+ classes = computed(() => `${this.narrow() ? 'lg:hidden ' : ''}block truncate text-caption tabular-nums ${SUB_TONE_CLASSES[this.tone()]}`, /* @ts-ignore */
302
+ ...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
303
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: UiCellSub, deps: [], target: i0.ɵɵFactoryTarget.Directive });
304
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.1.7", type: UiCellSub, isStandalone: true, selector: "[uiCellSub]", inputs: { narrow: { classPropertyName: "narrow", publicName: "narrow", isSignal: true, isRequired: false, transformFunction: null }, tone: { classPropertyName: "tone", publicName: "tone", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "classes()" } }, ngImport: i0 });
305
+ }
306
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: UiCellSub, decorators: [{
307
+ type: Directive,
308
+ args: [{
309
+ selector: '[uiCellSub]',
310
+ host: {
311
+ '[class]': 'classes()',
312
+ },
313
+ }]
314
+ }], propDecorators: { narrow: [{ type: i0.Input, args: [{ isSignal: true, alias: "narrow", required: false }] }], tone: [{ type: i0.Input, args: [{ isSignal: true, alias: "tone", required: false }] }] } });
315
+
316
+ /**
317
+ * Generated bundle index. Do not edit.
318
+ */
319
+
320
+ export { CELL_BREAKPOINTS, GROUP_SIZES, SUB_TONES, TABLE_ROWS, UiCellSub, UiGroup, UiGroupCell, UiRowAction, UiRowLink, UiTable, UiTd, UiTh, UiTr };
321
+ //# sourceMappingURL=joanroucoux-cairn-ui-table.mjs.map