@besaitech/ng-design-system 0.0.76 → 0.0.78

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/index.d.ts CHANGED
@@ -1532,6 +1532,58 @@ declare class SdsStatusTile {
1532
1532
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<SdsStatusTile, "sds-status-tile", never, { "title": { "alias": "title"; "required": true; "isSignal": true; }; "subtitle": { "alias": "subtitle"; "required": false; "isSignal": true; }; "image": { "alias": "image"; "required": false; "isSignal": true; }; "imageAlt": { "alias": "imageAlt"; "required": false; "isSignal": true; }; "state": { "alias": "state"; "required": false; "isSignal": true; }; "note": { "alias": "note"; "required": false; "isSignal": true; }; "selected": { "alias": "selected"; "required": false; "isSignal": true; }; "busy": { "alias": "busy"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "availableLabel": { "alias": "availableLabel"; "required": false; "isSignal": true; }; "soldOutLabel": { "alias": "soldOutLabel"; "required": false; "isSignal": true; }; "hiddenLabel": { "alias": "hiddenLabel"; "required": false; "isSignal": true; }; }, { "activate": "activate"; "imageError": "imageError"; }, never, never, true, never>;
1533
1533
  }
1534
1534
 
1535
+ /**
1536
+ * Clinical severity, lowest to highest. `unknown` is not a low severity — it means nobody has
1537
+ * assessed it, which is a different statement and deliberately sits outside the ramp.
1538
+ */
1539
+ type SdsSeverityLevel = 'unknown' | 'mild' | 'moderate' | 'severe' | 'critical';
1540
+ type SdsSeverityVariant = 'badge' | 'meter';
1541
+ type SdsSeveritySize = 'sm' | 'md';
1542
+ /**
1543
+ * How bad the thing itself is — an allergy's criticality, a reaction, an observation's abnormal
1544
+ * flag, a triage level.
1545
+ *
1546
+ * <b>This is not `sds-badge` with a status colour.</b> Status says what the UI did (saved, failed);
1547
+ * severity says what the record says. A red meaning "save failed" in one place and "anaphylaxis" in
1548
+ * another is a safety problem, so severity has its own measured ramp (see base.css) and its own
1549
+ * shape: five ordered steps that can render as a filled meter, where status is three categorical
1550
+ * states that render as a badge.
1551
+ *
1552
+ * <b>[label] is required and is never defaulted.</b> The component will not invent the word
1553
+ * "Severe" for you: colour alone must not carry meaning (greyscale, colour-blind readers, screen
1554
+ * readers), and a hardcoded English default is the exact bug that ships a trilingual app with one
1555
+ * untranslatable word in it. Pass your own translated text.
1556
+ *
1557
+ * `critical` is filled rather than tinted — the top of a scale should be louder than one more step
1558
+ * of the same treatment.
1559
+ *
1560
+ * @example
1561
+ * <sds-severity level="severe" [label]="'allergy.severe' | translate" />
1562
+ * <sds-severity level="moderate" variant="meter" [label]="'reaction.moderate' | translate" />
1563
+ */
1564
+ declare class SdsSeverity {
1565
+ readonly level: _angular_core.InputSignal<SdsSeverityLevel>;
1566
+ /** The visible wording, in the reader's language. Required on purpose — see the class docs. */
1567
+ readonly label: _angular_core.InputSignal<string>;
1568
+ readonly variant: _angular_core.InputSignal<SdsSeverityVariant>;
1569
+ readonly size: _angular_core.InputSignal<SdsSeveritySize>;
1570
+ /**
1571
+ * Accessible name for the meter, when the visible label alone would not say what the number
1572
+ * means ("Élevée" out of context). Defaults to the label.
1573
+ */
1574
+ readonly ariaLabel: _angular_core.InputSignal<string>;
1575
+ protected readonly ramp: readonly SdsSeverityLevel[];
1576
+ protected readonly small: _angular_core.Signal<boolean>;
1577
+ protected readonly tintClass: _angular_core.Signal<string>;
1578
+ protected readonly dotClass: _angular_core.Signal<string>;
1579
+ protected readonly fillClass: _angular_core.Signal<string>;
1580
+ protected readonly accessibleName: _angular_core.Signal<string>;
1581
+ /** How many of the four steps are lit. `unknown` lights none: it is not a low score. */
1582
+ protected readonly reached: _angular_core.Signal<number>;
1583
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<SdsSeverity, never>;
1584
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SdsSeverity, "sds-severity", never, { "level": { "alias": "level"; "required": true; "isSignal": true; }; "label": { "alias": "label"; "required": true; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
1585
+ }
1586
+
1535
1587
  /** An actionable row. */
1536
1588
  interface SdsMenuAction {
1537
1589
  /** Optional stable id, handy in the `(select)` handler. */
@@ -2499,7 +2551,7 @@ declare class SdsRangeCalendar {
2499
2551
  /** BCP 47 locale for month and weekday names. Defaults to `en-GB`; pass the app's locale. */
2500
2552
  readonly locale: _angular_core.InputSignal<string>;
2501
2553
  /** Months shown side by side (from the `sm` breakpoint; always one below it). */
2502
- readonly months: _angular_core.InputSignal<2 | 1>;
2554
+ readonly months: _angular_core.InputSignal<1 | 2>;
2503
2555
  /** Accessible name of the calendar group. English default — translate it in the app. */
2504
2556
  readonly calendarLabel: _angular_core.InputSignal<string>;
2505
2557
  /** Accessible name of the icon-only "previous month" button (its ONLY name — translate it). */
@@ -2518,7 +2570,7 @@ declare class SdsRangeCalendar {
2518
2570
  protected readonly hovered: _angular_core.WritableSignal<Date | null>;
2519
2571
  private readonly wide;
2520
2572
  /** Months actually rendered: {@link months}, but one on narrow viewports. */
2521
- protected readonly monthsShown: _angular_core.Signal<2 | 1>;
2573
+ protected readonly monthsShown: _angular_core.Signal<1 | 2>;
2522
2574
  constructor();
2523
2575
  private watchViewport;
2524
2576
  protected readonly navBtn = "inline-flex h-8 w-8 items-center justify-center rounded-control text-ink-soft hover:bg-muted focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-brand-500 disabled:cursor-not-allowed disabled:opacity-40";
@@ -2597,7 +2649,7 @@ declare class SdsDateRangePicker implements OnDestroy {
2597
2649
  readonly size: _angular_core.InputSignal<SdsDateRangePickerSize>;
2598
2650
  readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
2599
2651
  /** Months side by side in the panel (from the `sm` breakpoint; always one below it). */
2600
- readonly months: _angular_core.InputSignal<2 | 1>;
2652
+ readonly months: _angular_core.InputSignal<1 | 2>;
2601
2653
  /**
2602
2654
  * Display formatter for the field. Default: `Intl.DateTimeFormat#formatRange` with day, short
2603
2655
  * month and year in {@link locale} (e.g. `1–7 Oct 2026`) — see `formatDateRange`.
@@ -5582,5 +5634,5 @@ declare const SDS_CHART_CONFIG: InjectionToken<SdsChartConfig>;
5582
5634
  */
5583
5635
  declare function provideSdsCharts(config: SdsChartConfig): Provider;
5584
5636
 
5585
- export { SDS_ALLERGENS, SDS_ALLERGEN_ICONS, SDS_ALLERGEN_LABELS_EN, SDS_CHART_CONFIG, SDS_CHART_LABELS_EN, SDS_ICONS, SDS_PHONE_COUNTRIES, SDS_THEME_STORAGE_KEY, SDS_UI_PREF_LANG_PARAM, SDS_UI_PREF_THEME_PARAM, SdsAccordion, SdsAccordionContent, SdsAccordionHeader, SdsAccordionPanel, SdsAccordionStore, SdsAddressAutocomplete, SdsAddressExtra, SdsAllergenIcon, SdsAvatar, SdsBadge, SdsBulkBar, SdsButton, SdsCalendar, SdsCard, SdsCheckbox, SdsChecklistRow, SdsChip, SdsChipGroup, SdsDatePicker, SdsDateRangePicker, SdsEnvBanner, SdsFileDrop, SdsFormActions, SdsIcon, SdsImageCropper, SdsInput, SdsInputNumber, SdsLanguageSwitcher, SdsLocalizedInput, SdsMenu, SdsMenuItem, SdsMenuTrigger, SdsMultiSelect, SdsNavGroup, SdsNavItem, SdsOtpInput, SdsPaginator, SdsPhoneInput, SdsRadio, SdsRangeCalendar, SdsScore, SdsSearchCommand, SdsSegmented, SdsSelect, SdsSelectEmpty, SdsSelectFooter, SdsSelectOption, SdsShell, SdsSidebar, SdsSortableHandle, SdsSortableItem, SdsSortableList, SdsStatusTile, SdsTab, SdsTabList, SdsTabPanel, SdsTabPanels, SdsTable, SdsTableCell, SdsTableEmpty, SdsTableHeader, SdsTableRowExpansion, SdsTabs, SdsTabsStore, SdsTextarea, SdsThemeService, SdsThemeToggle, SdsTimeInput, SdsToastHost, SdsToastService, SdsToggleSwitch, SdsTopbar, SdsTriStateChip, SdsUserMenu, SidebarStore, addDays, addMonths, addMonthsKeepDay, appendUiPrefs, diffInDays, formatDateRange, formatDdMmYyyy, formatHhMm, isOutOfRange, isSameDay, isSameRange, isSdsThemeMode, isoDay, pad2, provideSdsCharts, readUiPrefs, sdsFileMatchesAccept, sdsFormatBytes, sdsFormatNational, sdsLastDays, sdsLastMonths, sdsMatchDialCode, sdsNormalizeSignificant, startOfDay, startOfMonth, stripUiPrefs };
5586
- export type { SdsAccordionActive, SdsAccordionValue, SdsAddressAutocompleteAppearance, SdsAddressAutocompleteShape, SdsAddressAutocompleteSize, SdsAddressExtraContext, SdsAddressExtraPosition, SdsAddressLocateFn, SdsAddressSearchFn, SdsAddressSuggestion, SdsAllergen, SdsAvatarShape, SdsAvatarStatus, SdsBadgeSize, SdsBadgeVariant, SdsBulkBarPosition, SdsButtonShape, SdsButtonSize, SdsButtonVariant, SdsCardVariant, SdsChartConfig, SdsChartLabels, SdsCheckboxSize, SdsChecklistStatus, SdsChipOption, SdsChipSize, SdsCropRect, SdsDatePickerSize, SdsDateRange, SdsDateRangePickerSize, SdsDateRangePreset, SdsEnvBannerEnv, SdsFileDropAppearance, SdsFileRejection, SdsFileRejectionReason, SdsFormActionsPosition, SdsIconName, SdsIconSize, SdsImageCropperBlobOptions, SdsImageCropperShape, SdsInputAppearance, SdsInputNumberAppearance, SdsInputNumberButtonLayout, SdsInputNumberCurrencyDisplay, SdsInputNumberMode, SdsInputNumberSize, SdsInputShape, SdsInputSize, SdsInputType, SdsKpiChangeText, SdsLanguageOption, SdsLanguageSwitcherAlign, SdsLanguageSwitcherAppearance, SdsLanguageSwitcherDirection, SdsLocalizedInputSize, SdsLocalizedValue, SdsMenuAction, SdsMenuAlign, SdsMenuEntry, SdsMenuItemTone, SdsMenuSeparator, SdsMultiSelectDisplay, SdsMultiSelectSize, SdsNavItemBadgeTone, SdsOtpInputSize, SdsPaginatorSize, SdsPaginatorState, SdsPhoneCountry, SdsPhoneInputSize, SdsPhoneValue, SdsRadioSize, SdsScoreSize, SdsScoreTier, SdsScoreVariant, SdsSearchAppearance, SdsSearchItem, SdsSegmentedOption, SdsSegmentedSize, SdsSelectAppearance, SdsSelectEmptyContext, SdsSelectFooterContext, SdsSelectOptionContext, SdsSelectSize, SdsShellBackground, SdsSidebarAppearance, SdsSortOrder, SdsSortableAppearance, SdsSortableItemContext, SdsSortableReorderEvent, SdsSparklineSummaryText, SdsStatusTileState, SdsTabValue, SdsTableCellCommitEvent, SdsTableCellContext, SdsTableCellErrors, SdsTableColumn, SdsTableEditTrigger, SdsTableEditor, SdsTableEmptyContext, SdsTableHeaderContext, SdsTableLazyEvent, SdsTableRowExpansionContext, SdsTableSelectOption, SdsTableSize, SdsTableSortEvent, SdsTabsVariant, SdsTextareaAppearance, SdsTextareaResize, SdsTextareaSize, SdsTheme, SdsThemeMode, SdsThemeToggleAppearance, SdsTimeInputAppearance, SdsTimeInputSize, SdsToast, SdsToastKind, SdsToggleSwitchSize, SdsTopbarAppearance, SdsTrendDirection, SdsTriState, SdsTriStateChipSize, SdsUiPrefs, SdsUserMenuAlign, SdsUserMenuAppearance };
5637
+ export { SDS_ALLERGENS, SDS_ALLERGEN_ICONS, SDS_ALLERGEN_LABELS_EN, SDS_CHART_CONFIG, SDS_CHART_LABELS_EN, SDS_ICONS, SDS_PHONE_COUNTRIES, SDS_THEME_STORAGE_KEY, SDS_UI_PREF_LANG_PARAM, SDS_UI_PREF_THEME_PARAM, SdsAccordion, SdsAccordionContent, SdsAccordionHeader, SdsAccordionPanel, SdsAccordionStore, SdsAddressAutocomplete, SdsAddressExtra, SdsAllergenIcon, SdsAvatar, SdsBadge, SdsBulkBar, SdsButton, SdsCalendar, SdsCard, SdsCheckbox, SdsChecklistRow, SdsChip, SdsChipGroup, SdsDatePicker, SdsDateRangePicker, SdsEnvBanner, SdsFileDrop, SdsFormActions, SdsIcon, SdsImageCropper, SdsInput, SdsInputNumber, SdsLanguageSwitcher, SdsLocalizedInput, SdsMenu, SdsMenuItem, SdsMenuTrigger, SdsMultiSelect, SdsNavGroup, SdsNavItem, SdsOtpInput, SdsPaginator, SdsPhoneInput, SdsRadio, SdsRangeCalendar, SdsScore, SdsSearchCommand, SdsSegmented, SdsSelect, SdsSelectEmpty, SdsSelectFooter, SdsSelectOption, SdsSeverity, SdsShell, SdsSidebar, SdsSortableHandle, SdsSortableItem, SdsSortableList, SdsStatusTile, SdsTab, SdsTabList, SdsTabPanel, SdsTabPanels, SdsTable, SdsTableCell, SdsTableEmpty, SdsTableHeader, SdsTableRowExpansion, SdsTabs, SdsTabsStore, SdsTextarea, SdsThemeService, SdsThemeToggle, SdsTimeInput, SdsToastHost, SdsToastService, SdsToggleSwitch, SdsTopbar, SdsTriStateChip, SdsUserMenu, SidebarStore, addDays, addMonths, addMonthsKeepDay, appendUiPrefs, diffInDays, formatDateRange, formatDdMmYyyy, formatHhMm, isOutOfRange, isSameDay, isSameRange, isSdsThemeMode, isoDay, pad2, provideSdsCharts, readUiPrefs, sdsFileMatchesAccept, sdsFormatBytes, sdsFormatNational, sdsLastDays, sdsLastMonths, sdsMatchDialCode, sdsNormalizeSignificant, startOfDay, startOfMonth, stripUiPrefs };
5638
+ export type { SdsAccordionActive, SdsAccordionValue, SdsAddressAutocompleteAppearance, SdsAddressAutocompleteShape, SdsAddressAutocompleteSize, SdsAddressExtraContext, SdsAddressExtraPosition, SdsAddressLocateFn, SdsAddressSearchFn, SdsAddressSuggestion, SdsAllergen, SdsAvatarShape, SdsAvatarStatus, SdsBadgeSize, SdsBadgeVariant, SdsBulkBarPosition, SdsButtonShape, SdsButtonSize, SdsButtonVariant, SdsCardVariant, SdsChartConfig, SdsChartLabels, SdsCheckboxSize, SdsChecklistStatus, SdsChipOption, SdsChipSize, SdsCropRect, SdsDatePickerSize, SdsDateRange, SdsDateRangePickerSize, SdsDateRangePreset, SdsEnvBannerEnv, SdsFileDropAppearance, SdsFileRejection, SdsFileRejectionReason, SdsFormActionsPosition, SdsIconName, SdsIconSize, SdsImageCropperBlobOptions, SdsImageCropperShape, SdsInputAppearance, SdsInputNumberAppearance, SdsInputNumberButtonLayout, SdsInputNumberCurrencyDisplay, SdsInputNumberMode, SdsInputNumberSize, SdsInputShape, SdsInputSize, SdsInputType, SdsKpiChangeText, SdsLanguageOption, SdsLanguageSwitcherAlign, SdsLanguageSwitcherAppearance, SdsLanguageSwitcherDirection, SdsLocalizedInputSize, SdsLocalizedValue, SdsMenuAction, SdsMenuAlign, SdsMenuEntry, SdsMenuItemTone, SdsMenuSeparator, SdsMultiSelectDisplay, SdsMultiSelectSize, SdsNavItemBadgeTone, SdsOtpInputSize, SdsPaginatorSize, SdsPaginatorState, SdsPhoneCountry, SdsPhoneInputSize, SdsPhoneValue, SdsRadioSize, SdsScoreSize, SdsScoreTier, SdsScoreVariant, SdsSearchAppearance, SdsSearchItem, SdsSegmentedOption, SdsSegmentedSize, SdsSelectAppearance, SdsSelectEmptyContext, SdsSelectFooterContext, SdsSelectOptionContext, SdsSelectSize, SdsSeverityLevel, SdsSeveritySize, SdsSeverityVariant, SdsShellBackground, SdsSidebarAppearance, SdsSortOrder, SdsSortableAppearance, SdsSortableItemContext, SdsSortableReorderEvent, SdsSparklineSummaryText, SdsStatusTileState, SdsTabValue, SdsTableCellCommitEvent, SdsTableCellContext, SdsTableCellErrors, SdsTableColumn, SdsTableEditTrigger, SdsTableEditor, SdsTableEmptyContext, SdsTableHeaderContext, SdsTableLazyEvent, SdsTableRowExpansionContext, SdsTableSelectOption, SdsTableSize, SdsTableSortEvent, SdsTabsVariant, SdsTextareaAppearance, SdsTextareaResize, SdsTextareaSize, SdsTheme, SdsThemeMode, SdsThemeToggleAppearance, SdsTimeInputAppearance, SdsTimeInputSize, SdsToast, SdsToastKind, SdsToggleSwitchSize, SdsTopbarAppearance, SdsTrendDirection, SdsTriState, SdsTriStateChipSize, SdsUiPrefs, SdsUserMenuAlign, SdsUserMenuAppearance };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@besaitech/ng-design-system",
3
- "version": "0.0.76",
3
+ "version": "0.0.78",
4
4
  "publishConfig": {
5
5
  "registry": "https://registry.npmjs.org/",
6
6
  "access": "public"
@@ -37,6 +37,10 @@
37
37
  "types": "./index.d.ts",
38
38
  "default": "./fesm2022/besaitech-ng-design-system.mjs"
39
39
  },
40
+ "./calendar": {
41
+ "types": "./calendar/index.d.ts",
42
+ "default": "./fesm2022/besaitech-ng-design-system-calendar.mjs"
43
+ },
40
44
  "./charts": {
41
45
  "types": "./charts/index.d.ts",
42
46
  "default": "./fesm2022/besaitech-ng-design-system-charts.mjs"
package/themes/base.css CHANGED
@@ -47,12 +47,50 @@
47
47
  --color-warning: #f3b73c;
48
48
  --color-danger: #df4f6b;
49
49
 
50
+ /*
51
+ * Clinical severity — an ORDINAL scale, and deliberately not the status trio.
52
+ *
53
+ * Status says what the UI did: saved, needs attention, failed. Severity says how bad the thing
54
+ * itself is. A red that sometimes means "save failed" and sometimes means "anaphylaxis" is a
55
+ * safety problem, so these are a separate ramp and must never be substituted for each other.
56
+ *
57
+ * Two mechanisms keep them apart. The COLOURS are perceptually distant: every level below is at
58
+ * least dE76 30 from the nearest of success/warning/danger in CIELAB, and adjacent levels are at
59
+ * least 27 from each other, so the ramp is readable as a ramp. The FORM differs too — status is
60
+ * three categorical states and renders as a solid badge, severity is five ordered steps and can
61
+ * render as a filled meter (sds-severity). Shape is the channel that survives greyscale.
62
+ *
63
+ * `unknown` sits OUTSIDE the ramp on purpose: "not assessed" is not a low severity, and colouring
64
+ * it like one tells a clinician something nobody established.
65
+ *
66
+ * Every fg clears 4.5:1 on surface, canvas, muted AND on its own -soft in both modes. If you
67
+ * restep one, re-measure it — nothing in the build will catch a contrast regression.
68
+ */
69
+ --color-severity-unknown: #55606f;
70
+ --color-severity-unknown-soft: #eef1f5;
71
+ --color-severity-mild: #0f766e;
72
+ --color-severity-mild-soft: #e2f3f0;
73
+ --color-severity-moderate: #9a4708;
74
+ --color-severity-moderate-soft: #fbeedd;
75
+ --color-severity-severe: #b91c1c;
76
+ --color-severity-severe-soft: #fde6e6;
77
+ --color-severity-critical: #7f1d1d;
78
+ --color-severity-critical-soft: #f7cccc;
79
+ /*
80
+ * The top step is FILLED rather than tinted, so it is louder than a colour change alone — and the
81
+ * fill needs its own pair. `-critical` is a foreground (dark red on a pale surface, light pink on
82
+ * a dark one), so reusing it as a background would, in dark mode, put pale text on pale pink.
83
+ * `-fill` is the background and `-on` the text that sits on it; both measured, both modes.
84
+ */
85
+ --color-severity-critical-fill: #7f1d1d;
86
+ --color-severity-critical-on: #ffffff;
87
+
50
88
  /* Radius */
51
89
  --radius-control: 0.5rem;
52
90
  --radius-card: 0.75rem;
53
91
 
54
92
  /* Typography — override in your app's own @theme if your brand uses a different face. */
55
- --font-sans: "Inter", "Segoe UI", system-ui, -apple-system, sans-serif;
93
+ --font-sans: 'Inter', 'Segoe UI', system-ui, -apple-system, sans-serif;
56
94
 
57
95
  /*
58
96
  * Ambient decoration — the slow, breathing drift of the brand-tinted blobs behind the glass top bar,
@@ -123,6 +161,20 @@ html.dark {
123
161
  --color-success: #34d67e;
124
162
  --color-warning: #f6c453;
125
163
  --color-danger: #f2748c;
164
+
165
+ /* Clinical severity — re-stepped for the dark surface, same measured rules as light. */
166
+ --color-severity-unknown: #a9b0bb;
167
+ --color-severity-unknown-soft: #27272b;
168
+ --color-severity-mild: #2dd4bf;
169
+ --color-severity-mild-soft: #0f2e2b;
170
+ --color-severity-moderate: #e8903a;
171
+ --color-severity-moderate-soft: #33240f;
172
+ --color-severity-severe: #f87171;
173
+ --color-severity-severe-soft: #361616;
174
+ --color-severity-critical: #fca5a5;
175
+ --color-severity-critical-soft: #3f1111;
176
+ --color-severity-critical-fill: #991b1b;
177
+ --color-severity-critical-on: #fee2e2;
126
178
  }
127
179
 
128
180
  /*
@@ -1,52 +1,68 @@
1
1
  /*
2
- * Saitech theme — the library's original brand blues, and its default.
2
+ * Saitech theme — the SAITECH brand teal, and the library's default.
3
3
  *
4
- * This file is the DEFAULT look every consumer got before themes existed, extracted verbatim so that
5
- * adding a second brand could not change the first one. If you are looking for the values that used to
6
- * live in the showcase's own `styles.css`, they are here.
4
+ * This file used to hold a monochrome zinc ramp under a comment calling it "brand blues". It was
5
+ * neither: it was the library's pre-theme default, extracted verbatim so that adding a second brand
6
+ * could not change the first. SAITECH's actual brand colour is the teal the public site at
7
+ * saitech.be is built on, so that is what this now carries.
7
8
  *
8
9
  * Import AFTER `@import "tailwindcss"` — Tailwind v4 processes `@theme` in imported files, and later
9
10
  * declarations win:
10
11
  *
11
12
  * @import "tailwindcss";
12
13
  * @source "../node_modules/@besaitech/ng-design-system";
14
+ * @import "@besaitech/ng-design-system/themes/base.css";
13
15
  * @import "@besaitech/ng-design-system/themes/saitech.css";
16
+ *
17
+ * WHY THE STOPS ARE NOT saitech.be's RAMP VERBATIM
18
+ * The public site uses Tailwind's teal, where 500 is #14b8a6 and 600 is #0d9488. Those are right for
19
+ * a marketing accent, which is mostly thin strokes, small text and dark-on-light buttons. They are
20
+ * wrong here, because this library hardcodes `text-white` on the brand fills — `bg-brand-600
21
+ * text-white` is the primary button, the selected calendar day and the active nav item, and
22
+ * `bg-brand-500 text-white` is the active nav item on a surface. Against white:
23
+ *
24
+ * #14b8a6 2.49:1 #0d9488 3.74:1 — both fail WCAG AA (4.5:1)
25
+ *
26
+ * So the ramp is the same hue, shifted darker at the interactive pins: 500 takes the value the
27
+ * public site calls 700, and everything below follows. Every stop that carries white text clears AA
28
+ * with room to spare. Keep it that way — if a stop here is ever lightened, check it against white
29
+ * first, because nothing in the build will catch it.
14
30
  */
15
31
  @theme {
16
- /* Brand blues */
17
- --color-brand-50: #fafafa;
18
- --color-brand-100: #f4f4f5;
19
- --color-brand-200: #e4e4e7;
20
- --color-brand-300: #d4d4d8;
21
- --color-brand-400: #a1a1aa;
22
- --color-brand-500: #52525b; /* active nav highlight */
23
- --color-brand-600: #27272a; /* primary button */
24
- --color-brand-700: #18181b; /* top bar base */
25
- --color-brand-800: #131316;
26
- --color-brand-900: #0a0a0b; /* sidebar background */
27
- --color-brand-950: #000000;
32
+ /* Brand teal */
33
+ --color-brand-50: #f0fdfa;
34
+ --color-brand-100: #ccfbf1;
35
+ --color-brand-200: #99f6e4;
36
+ --color-brand-300: #5eead4;
37
+ --color-brand-400: #2dd4bf;
38
+ --color-brand-500: #0f766e; /* active nav highlight — 5.47:1 on white */
39
+ --color-brand-600: #115e59; /* primary button — 7.58:1 on white */
40
+ --color-brand-700: #134e4a; /* top bar base */
41
+ --color-brand-800: #0f3c39;
42
+ --color-brand-900: #0a2b29; /* sidebar background — a near-black with the brand cast */
43
+ --color-brand-950: #04201e;
28
44
  }
29
45
 
30
46
  /*
31
47
  * Dark brand ramp. The base.css `.dark` block already flips the neutral roles; this flips the eleven
32
- * brand steps so the monochrome ramp stays legible on a dark canvas. The pins keep their meaning:
48
+ * brand steps so the ramp stays legible on a dark canvas. The pins keep their meaning:
33
49
  *
34
50
  * 50/100/200 soft brand tints (chips, the glass bar's brand edge) — must go DARK, not stay near-white
35
51
  * 500 active nav highlight — light enough to read as "selected" on the dark rail/surface
36
- * 600 primary button — a mid chip that keeps white label text readable (~9:1)
52
+ * 600 primary button — a mid chip that keeps white label text readable
37
53
  * 700 glass top-bar edge
38
54
  * 900 sidebar rail background
39
55
  */
40
56
  html.dark {
41
- --color-brand-50: #1c1c20;
42
- --color-brand-100: #212127;
43
- --color-brand-200: #2a2a31;
44
- --color-brand-300: #3a3a42;
45
- --color-brand-400: #52525b;
46
- --color-brand-500: #6f6f7a; /* active nav highlight — dark enough for white label text to reach AA */
47
- --color-brand-600: #3f3f46; /* primary button */
48
- --color-brand-700: #2a2a31; /* glass top-bar edge */
49
- --color-brand-800: #202024;
50
- --color-brand-900: #14141a; /* sidebar rail background */
57
+ --color-brand-50: #0c2422;
58
+ --color-brand-100: #0f2e2b;
59
+ --color-brand-200: #13403c;
60
+ --color-brand-300: #1a564f;
61
+ --color-brand-400: #1d6b62;
62
+ --color-brand-500: #237a6f; /* active nav highlight — 5.14:1 on white, 3.27:1 against the 900 rail */
63
+ --color-brand-600: #1a5f58; /* primary button — 7.44:1 on white */
64
+ --color-brand-700: #14403c; /* glass top-bar edge */
65
+ --color-brand-800: #102f2d;
66
+ --color-brand-900: #0a211f; /* sidebar rail background */
51
67
  --color-brand-950: #000000;
52
68
  }