@africanies/angular-web-sdk 0.1.6 → 0.1.8
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/.nx/cache/{17491371155400585077 → 13466509747676776487}/dist/libs/africanies-core/fesm2022/africanies-africanies-core.mjs +139 -51
- package/.nx/cache/13466509747676776487/dist/libs/africanies-core/fesm2022/africanies-africanies-core.mjs.map +1 -0
- package/.nx/cache/{17491371155400585077 → 13466509747676776487}/dist/libs/africanies-core/types/africanies-africanies-core.d.ts +14 -11
- package/.nx/cache/{17499961385238663835 → 14995846848874973576}/dist/libs/africanies-ui/fesm2022/africanies-africanies-ui.mjs +83 -63
- package/.nx/cache/14995846848874973576/dist/libs/africanies-ui/fesm2022/africanies-africanies-ui.mjs.map +1 -0
- package/.nx/cache/{17499961385238663835 → 14995846848874973576}/dist/libs/africanies-ui/types/africanies-africanies-ui.d.ts +22 -19
- package/.nx/cache/{12276756491762927325 → 15302120112746851896}/dist/libs/africanies-theme/fesm2022/africanies-africanies-theme.mjs +34 -6
- package/.nx/cache/15302120112746851896/dist/libs/africanies-theme/fesm2022/africanies-africanies-theme.mjs.map +1 -0
- package/.nx/cache/{12276756491762927325 → 15302120112746851896}/dist/libs/africanies-theme/tailwind-preset.cjs +104 -19
- package/.nx/cache/{12276756491762927325 → 15302120112746851896}/dist/libs/africanies-theme/types/africanies-africanies-theme.d.ts +21 -2
- package/.nx/cache/18393832731522001121/dist/libs/africanies-core/README.md +85 -0
- package/.nx/cache/18393832731522001121/dist/libs/africanies-core/fesm2022/africanies-africanies-core.mjs +4634 -0
- package/.nx/cache/18393832731522001121/dist/libs/africanies-core/fesm2022/africanies-africanies-core.mjs.map +1 -0
- package/.nx/cache/18393832731522001121/dist/libs/africanies-core/package.json +31 -0
- package/.nx/cache/18393832731522001121/dist/libs/africanies-core/types/africanies-africanies-core.d.ts +2743 -0
- package/.nx/cache/5151121439688073678/dist/libs/africanies-icons/README.md +69 -0
- package/.nx/cache/5151121439688073678/dist/libs/africanies-icons/assets/icons.sprite.svg +1851 -0
- package/.nx/cache/5151121439688073678/dist/libs/africanies-icons/fesm2022/africanies-africanies-icons.mjs +833 -0
- package/.nx/cache/5151121439688073678/dist/libs/africanies-icons/fesm2022/africanies-africanies-icons.mjs.map +1 -0
- package/.nx/cache/5151121439688073678/dist/libs/africanies-icons/package.json +30 -0
- package/.nx/cache/5151121439688073678/dist/libs/africanies-icons/types/africanies-africanies-icons.d.ts +108 -0
- package/.nx/cache/{4082520855419352840 → 6673686859704879504}/dist/libs/africanies-theme/fesm2022/africanies-africanies-theme.mjs +12 -2
- package/.nx/cache/6673686859704879504/dist/libs/africanies-theme/fesm2022/africanies-africanies-theme.mjs.map +1 -0
- package/.nx/cache/{4082520855419352840 → 6673686859704879504}/dist/libs/africanies-theme/tailwind-preset.cjs +16 -7
- package/.nx/cache/{4082520855419352840 → 6673686859704879504}/dist/libs/africanies-theme/types/africanies-africanies-theme.d.ts +11 -3
- package/.nx/cache/877026836685850193/dist/libs/africanies-models/README.md +60 -0
- package/.nx/cache/877026836685850193/dist/libs/africanies-models/fesm2022/africanies-africanies-models.mjs +613 -0
- package/.nx/cache/877026836685850193/dist/libs/africanies-models/fesm2022/africanies-africanies-models.mjs.map +1 -0
- package/.nx/cache/877026836685850193/dist/libs/africanies-models/package.json +23 -0
- package/.nx/cache/877026836685850193/dist/libs/africanies-models/types/africanies-africanies-models.d.ts +1452 -0
- package/.nx/cache/{3314955264390318442 → 9406544675747598148}/dist/libs/africanies-ui/fesm2022/africanies-africanies-ui.mjs +866 -632
- package/.nx/cache/9406544675747598148/dist/libs/africanies-ui/fesm2022/africanies-africanies-ui.mjs.map +1 -0
- package/.nx/cache/{3314955264390318442 → 9406544675747598148}/dist/libs/africanies-ui/types/africanies-africanies-ui.d.ts +170 -130
- package/.nx/cache/run.json +42 -42
- package/.nx/cache/terminalOutputs/{17491371155400585077 → 13466509747676776487} +1 -1
- package/.nx/cache/terminalOutputs/14995846848874973576 +21 -0
- package/.nx/cache/terminalOutputs/{3017748574492080228 → 15149466893522345489} +16 -7
- package/.nx/cache/terminalOutputs/{4082520855419352840 → 15302120112746851896} +1 -1
- package/.nx/cache/terminalOutputs/{8648260256613557249 → 15835338512221847842} +18 -8
- package/.nx/cache/terminalOutputs/17960163310445607219 +6 -0
- package/.nx/cache/terminalOutputs/18393832731522001121 +21 -0
- package/.nx/cache/terminalOutputs/{3314955264390318442 → 5151121439688073678} +6 -6
- package/.nx/cache/terminalOutputs/{12276756491762927325 → 6673686859704879504} +2 -2
- package/.nx/cache/terminalOutputs/7462873189468732296 +17 -0
- package/.nx/cache/terminalOutputs/8032148447904822353 +185 -0
- package/.nx/cache/terminalOutputs/877026836685850193 +21 -0
- package/.nx/cache/terminalOutputs/9406544675747598148 +21 -0
- package/.nx/workspace-data/0091ABA9-5C90-580D-953C-8C94E763ADB5-v3.db +0 -0
- package/.nx/workspace-data/0091ABA9-5C90-580D-953C-8C94E763ADB5-v3.db-shm +0 -0
- package/.nx/workspace-data/0091ABA9-5C90-580D-953C-8C94E763ADB5-v3.db-wal +0 -0
- package/.nx/workspace-data/d/daemon.log +3962 -0
- package/.nx/workspace-data/d/server-process.json +2 -2
- package/.nx/workspace-data/file-map.json +3102 -3036
- package/.nx/workspace-data/nx_files.nxt +0 -0
- package/.nx/workspace-data/project-graph.json +7 -2
- package/apps/playground/src/app/pages/button-page.ts +5 -3
- package/apps/playground/src/app/pages/feedback-page.ts +1 -1
- package/apps/playground/src/app/pages/home-page.ts +1 -1
- package/apps/playground/src/app/pages/icons-page.ts +3 -3
- package/apps/playground/src/app/pages/lecture-page.ts +3 -3
- package/apps/playground/src/app/pages/models-page.ts +1 -1
- package/apps/playground/src/app/pages/overlay-demos.ts +1 -1
- package/apps/playground/src/app/pages/tokens-page.ts +29 -11
- package/apps/playground/src/app/pages/usecases/onboarding-login.page.ts +1 -1
- package/apps/playground/src/app/pages/usecases/onboarding-reset-password.page.ts +1 -1
- package/apps/playground/src/app/pages/usecases/shipment-detail.page.ts +1 -1
- package/apps/playground/src/app/pages/viewport-preview.component.ts +1 -1
- package/apps/playground/src/app/snippets/button.snippets.ts +4 -3
- package/apps/playground/src/app/snippets/filters.snippets.ts +10 -0
- package/apps/playground/src/index.html +6 -0
- package/apps/playground/src/styles.css +4 -5
- package/dist/libs/africanies-core/fesm2022/africanies-africanies-core.mjs +131 -8
- package/dist/libs/africanies-core/fesm2022/africanies-africanies-core.mjs.map +1 -1
- package/dist/libs/africanies-core/types/africanies-africanies-core.d.ts +8 -6
- package/dist/libs/africanies-icons/assets/icons.sprite.svg +7 -0
- package/dist/libs/africanies-icons/fesm2022/africanies-africanies-icons.mjs +1 -0
- package/dist/libs/africanies-icons/fesm2022/africanies-africanies-icons.mjs.map +1 -1
- package/dist/libs/africanies-icons/types/africanies-africanies-icons.d.ts +2 -2
- package/dist/libs/africanies-models/fesm2022/africanies-africanies-models.mjs +22 -8
- package/dist/libs/africanies-models/fesm2022/africanies-africanies-models.mjs.map +1 -1
- package/dist/libs/africanies-theme/fesm2022/africanies-africanies-theme.mjs +30 -8
- package/dist/libs/africanies-theme/fesm2022/africanies-africanies-theme.mjs.map +1 -1
- package/dist/libs/africanies-theme/tailwind-preset.cjs +89 -12
- package/dist/libs/africanies-theme/types/africanies-africanies-theme.d.ts +14 -4
- package/dist/libs/africanies-ui/fesm2022/africanies-africanies-ui.mjs +765 -615
- package/dist/libs/africanies-ui/fesm2022/africanies-africanies-ui.mjs.map +1 -1
- package/dist/libs/africanies-ui/types/africanies-africanies-ui.d.ts +148 -115
- package/libs/africanies-core/src/index.ts +1 -0
- package/libs/africanies-core/src/lib/notification/index.ts +1 -1
- package/libs/africanies-core/src/lib/notification/notification-link.spec.ts +40 -7
- package/libs/africanies-core/src/lib/notification/notification-link.ts +143 -7
- package/libs/africanies-icons/src/assets/icons.sprite.svg +7 -0
- package/libs/africanies-icons/src/lib/icon-name.ts +1 -0
- package/libs/africanies-models/src/lib/filters/configs/seed-configs.ts +22 -8
- package/libs/africanies-theme/src/lib/mode-color.safelist.ts +20 -2
- package/libs/africanies-theme/src/lib/mode-color.service.spec.ts +55 -0
- package/libs/africanies-theme/src/lib/mode-color.service.ts +23 -7
- package/libs/africanies-theme/tailwind-preset.cjs +89 -12
- package/libs/africanies-ui/src/lib/action-menu/action-menu.component.ts +3 -3
- package/libs/africanies-ui/src/lib/alert/alert.component.ts +4 -4
- package/libs/africanies-ui/src/lib/avatar/avatar-menu.component.ts +2 -2
- package/libs/africanies-ui/src/lib/button/button.component.spec.ts +7 -7
- package/libs/africanies-ui/src/lib/button/button.component.ts +10 -6
- package/libs/africanies-ui/src/lib/chip/chip.component.ts +4 -4
- package/libs/africanies-ui/src/lib/content-stack/content-stack.component.ts +1 -1
- package/libs/africanies-ui/src/lib/feedback/empty-state.component.ts +1 -1
- package/libs/africanies-ui/src/lib/feedback/error-indicator.component.ts +3 -3
- package/libs/africanies-ui/src/lib/feedback/error-state.component.ts +3 -3
- package/libs/africanies-ui/src/lib/filters/filter-drawer.panel.ts +44 -27
- package/libs/africanies-ui/src/lib/forms/checkbox/checkbox.component.ts +2 -1
- package/libs/africanies-ui/src/lib/forms/file-upload/file-preview.dialog.ts +2 -2
- package/libs/africanies-ui/src/lib/forms/file-upload/file-upload.component.ts +5 -5
- package/libs/africanies-ui/src/lib/forms/form-field.classes.ts +37 -7
- package/libs/africanies-ui/src/lib/forms/otp-input/otp-input.component.ts +2 -1
- package/libs/africanies-ui/src/lib/forms/radio/radio.component.ts +2 -1
- package/libs/africanies-ui/src/lib/forms/select/select.component.ts +2 -2
- package/libs/africanies-ui/src/lib/forms/toggle/toggle.component.ts +1 -1
- package/libs/africanies-ui/src/lib/image/image.component.ts +1 -1
- package/libs/africanies-ui/src/lib/info-popover/info-popover.component.ts +2 -2
- package/libs/africanies-ui/src/lib/layout/app-shell-content-header.component.ts +1 -1
- package/libs/africanies-ui/src/lib/layout/app-shell-header.component.ts +6 -6
- package/libs/africanies-ui/src/lib/layout/app-shell.component.html +2 -2
- package/libs/africanies-ui/src/lib/layout/app-shell.component.ts +5 -5
- package/libs/africanies-ui/src/lib/navigation/shipping-mode-switch/shipping-mode-switch.component.ts +4 -4
- package/libs/africanies-ui/src/lib/navigation/side-nav/africanies-side-nav.component.html +21 -13
- package/libs/africanies-ui/src/lib/navigation/side-nav/africanies-side-nav.component.ts +23 -13
- package/libs/africanies-ui/src/lib/notifications/notification-drawer.panel.ts +27 -14
- package/libs/africanies-ui/src/lib/overlay/confirm-dialog.component.ts +2 -2
- package/libs/africanies-ui/src/lib/overlay/drawer.service.ts +3 -3
- package/libs/africanies-ui/src/lib/overlay/modal.service.ts +4 -4
- package/libs/africanies-ui/src/lib/overlay/overlay-frame.component.ts +1 -1
- package/libs/africanies-ui/src/lib/pagination/pagination.component.ts +4 -4
- package/libs/africanies-ui/src/lib/stepper/stepper.component.ts +7 -7
- package/libs/africanies-ui/src/lib/table/table-column.ts +9 -0
- package/libs/africanies-ui/src/lib/table/table.component.spec.ts +99 -0
- package/libs/africanies-ui/src/lib/table/table.component.ts +75 -33
- package/libs/africanies-ui/src/lib/toast/toast-host.component.ts +4 -4
- package/libs/africanies-ui/src/lib/toast/toast-item.component.ts +7 -7
- package/package.json +1 -1
- package/svg/hand-coins.svg +9 -0
- package/.nx/cache/12276756491762927325/dist/libs/africanies-theme/fesm2022/africanies-africanies-theme.mjs.map +0 -1
- package/.nx/cache/17491371155400585077/dist/libs/africanies-core/fesm2022/africanies-africanies-core.mjs.map +0 -1
- package/.nx/cache/17499961385238663835/dist/libs/africanies-ui/fesm2022/africanies-africanies-ui.mjs.map +0 -1
- package/.nx/cache/3314955264390318442/dist/libs/africanies-ui/fesm2022/africanies-africanies-ui.mjs.map +0 -1
- package/.nx/cache/4082520855419352840/dist/libs/africanies-theme/fesm2022/africanies-africanies-theme.mjs.map +0 -1
- package/.nx/cache/terminalOutputs/17499961385238663835 +0 -21
- /package/.nx/cache/{17491371155400585077 → 13466509747676776487}/dist/libs/africanies-core/README.md +0 -0
- /package/.nx/cache/{17491371155400585077 → 13466509747676776487}/dist/libs/africanies-core/package.json +0 -0
- /package/.nx/cache/{17499961385238663835 → 14995846848874973576}/dist/libs/africanies-ui/README.md +0 -0
- /package/.nx/cache/{17499961385238663835 → 14995846848874973576}/dist/libs/africanies-ui/assets/brand/africanies-logo-mini.png +0 -0
- /package/.nx/cache/{17499961385238663835 → 14995846848874973576}/dist/libs/africanies-ui/assets/brand/africanies-logo.png +0 -0
- /package/.nx/cache/{17499961385238663835 → 14995846848874973576}/dist/libs/africanies-ui/assets/brand/africanies-logo.svg +0 -0
- /package/.nx/cache/{17499961385238663835 → 14995846848874973576}/dist/libs/africanies-ui/assets/carriers/dhl.svg +0 -0
- /package/.nx/cache/{17499961385238663835 → 14995846848874973576}/dist/libs/africanies-ui/package.json +0 -0
- /package/.nx/cache/{12276756491762927325 → 15302120112746851896}/dist/libs/africanies-theme/README.md +0 -0
- /package/.nx/cache/{12276756491762927325 → 15302120112746851896}/dist/libs/africanies-theme/package.json +0 -0
- /package/.nx/cache/{4082520855419352840 → 6673686859704879504}/dist/libs/africanies-theme/README.md +0 -0
- /package/.nx/cache/{4082520855419352840 → 6673686859704879504}/dist/libs/africanies-theme/package.json +0 -0
- /package/.nx/cache/{3314955264390318442 → 9406544675747598148}/dist/libs/africanies-ui/README.md +0 -0
- /package/.nx/cache/{3314955264390318442 → 9406544675747598148}/dist/libs/africanies-ui/assets/brand/africanies-logo-mini.png +0 -0
- /package/.nx/cache/{3314955264390318442 → 9406544675747598148}/dist/libs/africanies-ui/assets/brand/africanies-logo.png +0 -0
- /package/.nx/cache/{3314955264390318442 → 9406544675747598148}/dist/libs/africanies-ui/assets/brand/africanies-logo.svg +0 -0
- /package/.nx/cache/{3314955264390318442 → 9406544675747598148}/dist/libs/africanies-ui/assets/carriers/dhl.svg +0 -0
- /package/.nx/cache/{3314955264390318442 → 9406544675747598148}/dist/libs/africanies-ui/package.json +0 -0
- /package/.nx/cache/terminalOutputs/{16279119293212733518 → 14005735098959303198} +0 -0
- /package/.nx/cache/terminalOutputs/{7126777490381568487 → 1446890025183346611} +0 -0
- /package/.nx/cache/terminalOutputs/{9408529484792607601 → 6337357866566791975} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"africanies-africanies-models.mjs","sources":["../../../../libs/africanies-models/src/lib/api/pagination.ts","../../../../libs/africanies-models/src/lib/delivery-vendor/delivery-vendor.ts","../../../../libs/africanies-models/src/lib/filters/filter-config.model.ts","../../../../libs/africanies-models/src/lib/filters/configs/seed-configs.ts","../../../../libs/africanies-models/src/lib/filters/filter-serialize.ts","../../../../libs/africanies-models/src/africanies-africanies-models.ts"],"sourcesContent":["/**\n * Allowed page sizes for list pagination (`size` query param).\n */\nexport const PAGINATION_PAGE_SIZES = [5, 15, 30] as const;\n\n/** One of {@link PAGINATION_PAGE_SIZES}. */\nexport type PaginationPageSize = (typeof PAGINATION_PAGE_SIZES)[number];\n\n/** Default `size` on paginated resource GETs. */\nexport const DEFAULT_PAGE_SIZE: PaginationPageSize = 15;\n\n/** Inbox / notification list page size. */\nexport const NOTIFICATION_PAGE_SIZE: PaginationPageSize = 30;\n","/**\n * Hardcoded inbound delivery vendor slugs — same values as legacy portal forms (no API).\n */\n\nexport /**\n *\n */\nconst DELIVERY_VENDORS = [\n { id: 'amazon', name: 'Amazon' },\n { id: 'dhl', name: 'DHL' },\n { id: 'fedex', name: 'FedEx' },\n { id: 'usps', name: 'USPS' },\n { id: 'ups', name: 'UPS' },\n { id: 'others', name: 'Others' },\n] as const;\n\n/**\n *\n */\nexport type DeliveryVendorId = (typeof DELIVERY_VENDORS)[number]['id'];\n\n/** Export box editor only — not used on inbound receive/edit forms. */\nexport const EXPORT_DELIVERY_VENDORS = [\n ...DELIVERY_VENDORS,\n { id: 'walk-in', name: 'Walk-In' },\n] as const;\n\n/**\n *\n */\nexport type ExportDeliveryVendorId =\n (typeof EXPORT_DELIVERY_VENDORS)[number]['id'];\n\n/** @deprecated Prefer {@link DELIVERY_VENDORS}. */\nexport const DELIVERY_VENDOR_OPTIONS = DELIVERY_VENDORS.map((row) => ({\n value: row.id,\n label: row.name,\n}));\n\n/** @deprecated Prefer {@link EXPORT_DELIVERY_VENDORS}. */\nexport const BOX_DELIVERY_VENDORS = EXPORT_DELIVERY_VENDORS;\n\n/** @deprecated Prefer {@link ExportDeliveryVendorId}. */\nexport type BoxDeliveryVendorId = ExportDeliveryVendorId;\n\nconst VENDOR_LABELS = Object.fromEntries(\n DELIVERY_VENDORS.map((row) => [row.id, row.name]),\n) as Record<DeliveryVendorId, string>;\n\n/**\n *\n * @param value\n */\nexport function normalizeDeliveryVendor(value: string): string {\n return value.trim().toLowerCase();\n}\n\n/**\n *\n * @param value\n */\nexport function isKnownDeliveryVendor(\n value: string | null | undefined,\n): boolean {\n const normalized = normalizeDeliveryVendor(value ?? '');\n if (!normalized) {\n return false;\n }\n return DELIVERY_VENDORS.some((vendor) => vendor.id === normalized);\n}\n\n/**\n * Lowercase known ids; keep raw string for legacy/custom stored values.\n * @param value\n */\nexport function normalizeDeliveryVendorForForm(\n value: string | null | undefined,\n): string {\n const raw = value?.trim() ?? '';\n if (!raw) {\n return '';\n }\n const normalized = normalizeDeliveryVendor(raw);\n if (isKnownDeliveryVendor(normalized)) {\n return normalized;\n }\n return raw;\n}\n\n/**\n *\n * @param value\n */\nexport function deliveryVendorLabel(value: string): string {\n const normalized = normalizeDeliveryVendor(value);\n if (!normalized || normalized === 'others') {\n return '';\n }\n return VENDOR_LABELS[normalized as DeliveryVendorId] ?? value.trim();\n}\n","/**\n * Schema-driven list filter contracts for AFRICANIES modules.\n *\n * Modules declare a {@link ModuleFilterConfigModel}; the UI drawer renders from\n * it and {@link toFilterParams} / {@link fromFilterParams} speak to the API.\n */\n\n/**\n * Backend wire format for filter query serialization.\n *\n * Use {@link resolveFilterTransport} when reading `config.transport` — omit the\n * property on {@link ModuleFilterConfigModel} to default to legacy-parallel.\n */\nexport const FilterTransport = {\n /** Laravel-style `filterColumn` + `filterValue` CSV pairs (default). */\n LegacyParallel: 'legacy-parallel',\n /** Each {@link FilterFieldModel.key} is its own query param. */\n Named: 'named',\n} as const;\n\n/** Union of {@link FilterTransport} literal values. */\nexport type FilterTransport =\n (typeof FilterTransport)[keyof typeof FilterTransport];\n\n/** Default when {@link ModuleFilterConfigModel.transport} is omitted. */\nexport const DEFAULT_FILTER_TRANSPORT = FilterTransport.LegacyParallel;\n\n/** How a filter field is rendered and validated in the drawer. */\nexport type FilterFieldType =\n /** Chip / single-select group — exclusive within the field by default. */\n | 'enum'\n /** Free-text scalar (tracking number, etc.). */\n | 'text'\n /** Static or host-resolved option list (warehouse, carrier, …). */\n | 'select'\n /** Yes/no mapped to API scalars (often `'1'` / `'0'`). */\n | 'boolean';\n\n/**\n * Option row for enum / select / boolean fields.\n *\n * `color` is a UI hint only (chip styling) — never sent to the API.\n */\nexport interface FilterOptionModel {\n /** Canonical value written into filter state / query params. */\n value: string;\n /** Visible label. */\n label: string;\n /** Optional leading text/emoji (e.g. country flag emoji) in select rows. */\n prefixText?: string;\n /** Optional leading image URL (e.g. flag CDN from {@link countryFlagUrl}). */\n prefixImageUrl?: string;\n /** Optional chip / badge color (hex or CSS). */\n color?: string;\n}\n\n/**\n * Well-known async option catalogs resolved by the SDK or host app.\n *\n * Built-in wiring ({@link FilterOptionsResolver} in `@africanies/africanies-core`):\n * - `warehouses` → {@link WarehouseService.readAll} → field keys like `warehouse_id`\n * - `shipmentMethods` → {@link ShipmentMethodService.readAll} → e.g. `shipment_method_id`\n *\n * Pass host `optionLists` for sources without a built-in service (e.g. `shipmentManifests`).\n */\nexport type FilterOptionsSource =\n | 'shipmentMethods'\n | 'warehouses'\n | 'shipmentManifests'\n | 'static';\n\n/**\n * One filterable API field inside a {@link ModuleFilterConfigModel}.\n */\nexport interface FilterFieldModel {\n /** API `filterColumn` name (e.g. `payment_status`). */\n key: string;\n /** Drawer section label. */\n label: string;\n /** Control kind. */\n type: FilterFieldType;\n /** Static options (enum / boolean / static select). */\n options?: FilterOptionModel[];\n /**\n * When true (default for `enum`), selecting a value replaces any prior value\n * for this key — chip groups are mutually exclusive per field.\n */\n exclusive?: boolean;\n /** Host-resolved option catalog name for `select` fields. */\n optionsSource?: FilterOptionsSource;\n /** Placeholder for text / select triggers. */\n placeholder?: string;\n}\n\n/**\n * Module-level filter schema — the only per-module difference for list filters.\n *\n * @example\n * ```ts\n * const trackShipmentsFilterConfig: ModuleFilterConfigModel = {\n * id: 'track-shipments',\n * // transport omitted → FilterTransport.LegacyParallel\n * fields: [\n * { key: 'payment_status', label: 'Payment Status', type: 'enum', options: […] },\n * ],\n * };\n * ```\n */\nexport interface ModuleFilterConfigModel {\n /** Stable module id (`track-shipments`, `users`, …). */\n id: string;\n /**\n * Optional portal route segments for docs / deep links\n * (e.g. `['portal', 'shipment', 'track-shipments']`).\n */\n route?: string[];\n /** Free-text search box. */\n search?: {\n param: 'search';\n label: string;\n placeholder?: string;\n };\n /** Date range + which date column the range applies to. */\n date?: {\n rangeParams: { from: 'from'; to: 'to' };\n fieldParam: 'date';\n fields: FilterOptionModel[];\n };\n /** Sort direction control. */\n sort?: {\n param: 'order';\n options: FilterOptionModel[];\n };\n /** Pagination query param names (defaults when omitted at serialize time). */\n pagination?: {\n pageParam: 'page';\n sizeParam: 'size';\n };\n /** Filterable fields rendered in the drawer. */\n fields: FilterFieldModel[];\n /**\n * Backend wire format — see {@link FilterTransport}.\n * Defaults to {@link DEFAULT_FILTER_TRANSPORT} when omitted.\n */\n transport?: FilterTransport;\n}\n\n/**\n * Preferred UI / feature state for filters.\n *\n * Keep values as a map keyed by {@link FilterFieldModel.key}; only flatten to\n * parallel comma strings at the API / URL boundary.\n */\nexport interface FilterStateModel {\n search?: string;\n /** Inclusive range start (`YYYY-MM-DD`). */\n from?: string;\n /** Inclusive range end (`YYYY-MM-DD`). */\n to?: string;\n /** Which date column `from`/`to` apply to (`created_at`, …). */\n date?: string;\n order?: 'asc' | 'desc' | string;\n page?: number;\n size?: number;\n /**\n * Field values keyed by {@link FilterFieldModel.key}.\n * Omit or set `undefined` / `''` to exclude from serialization.\n */\n values: Record<string, string | undefined>;\n}\n\n/**\n * Flat query / API bag produced by {@link toFilterParams}.\n * Values are strings (or numbers for page/size) ready for HttpParams / router.\n */\nexport type FilterParamsModel = Record<string, string | number | undefined>;\n\n/**\n * Resolved transport for a module config (defaults to {@link DEFAULT_FILTER_TRANSPORT}).\n * @param config\n */\nexport function resolveFilterTransport(\n config: Pick<ModuleFilterConfigModel, 'transport'>,\n): FilterTransport {\n return config.transport ?? DEFAULT_FILTER_TRANSPORT;\n}\n","import type { ModuleFilterConfigModel } from '../filter-config.model';\nimport { FilterTransport } from '../filter-config.model';\n\n/**\n * Track shipments — payment / shipment status chips + tracking number.\n * Transport: legacy `filterColumn` / `filterValue`.\n */\nexport const trackShipmentsFilterConfig: ModuleFilterConfigModel = {\n id: 'track-shipments',\n route: ['portal', 'shipment', 'track-shipments'],\n transport: 'legacy-parallel',\n pagination: { pageParam: 'page', sizeParam: 'size' },\n search: {\n param: 'search',\n label: 'Shipment ID',\n placeholder: 'Search',\n },\n date: {\n rangeParams: { from: 'from', to: 'to' },\n fieldParam: 'date',\n fields: [{ value: 'created_at', label: 'Date Created' }],\n },\n sort: {\n param: 'order',\n options: [\n { value: 'asc', label: 'Ascending' },\n { value: 'desc', label: 'Descending' },\n ],\n },\n fields: [\n {\n key: 'payment_status',\n label: 'Payment Status',\n type: 'enum',\n exclusive: true,\n options: [\n { value: 'paid', label: 'Paid', color: '#25945c' },\n { value: 'unpaid', label: 'Unpaid', color: '#f48220' },\n ],\n },\n {\n key: 'shipment_status',\n label: 'Shipment Status',\n type: 'enum',\n exclusive: true,\n options: [\n { value: 'pending', label: 'Pending', color: '#DBB316' },\n { value: 'in-process', label: 'In Process', color: '#3B82F6' },\n { value: 'completed', label: 'Completed', color: '#25945c' },\n ],\n },\n {\n key: 'tracking_number',\n label: 'Tracking Number',\n type: 'text',\n placeholder: 'Search',\n },\n ],\n};\n\n/**\n * Update shipments — richest legacy filter set (enums + entity selects + booleans).\n */\nexport const updateShipmentsFilterConfig: ModuleFilterConfigModel = {\n id: 'update-shipments',\n route: ['portal', 'shipment', 'update-shipments'],\n transport: 'legacy-parallel',\n pagination: { pageParam: 'page', sizeParam: 'size' },\n search: {\n param: 'search',\n label: 'Shipment ID',\n placeholder: 'Search',\n },\n date: {\n rangeParams: { from: 'from', to: 'to' },\n fieldParam: 'date',\n fields: [\n { value: 'created_at', label: 'Date Created' },\n { value: 'paid_at', label: 'Date of Payment' },\n { value: 'packaged_at', label: 'Date Packaged' },\n { value: 'shipment_processed_at', label: 'Date Processed' },\n ],\n },\n sort: {\n param: 'order',\n options: [\n { value: 'asc', label: 'Ascending' },\n { value: 'desc', label: 'Descending' },\n ],\n },\n fields: [\n {\n key: 'payment_status',\n label: 'Payment Status',\n type: 'enum',\n exclusive: true,\n options: [\n { value: 'paid', label: 'Paid', color: '#25945c' },\n { value: 'unpaid', label: 'Unpaid', color: '#f48220' },\n ],\n },\n {\n key: 'shipment_status',\n label: 'Shipment Status',\n type: 'enum',\n exclusive: true,\n options: [\n { value: 'pending', label: 'Pending', color: '#DBB316' },\n { value: 'in-process', label: 'In Process', color: '#3B82F6' },\n { value: 'completed', label: 'Completed', color: '#25945c' },\n ],\n },\n {\n key: 'type',\n label: 'Shipment Type',\n type: 'enum',\n exclusive: true,\n options: [\n { value: 'shipment', label: 'Shipment', color: '#3B82F6' },\n { value: 'etw_shipment', label: 'ETW Shipment', color: '#8B5CF6' },\n ],\n },\n {\n key: 'shipment_method_id',\n label: 'Shipment Carrier',\n type: 'select',\n optionsSource: 'shipmentMethods',\n placeholder: 'Shipment Methods',\n },\n {\n key: 'type_of_user',\n label: 'User Type',\n type: 'select',\n optionsSource: 'static',\n options: [\n { value: 'individual', label: 'Individual' },\n { value: 'business', label: 'Business' },\n ],\n placeholder: 'User Type',\n },\n {\n key: 'warehouse_id',\n label: 'Warehouse',\n type: 'select',\n optionsSource: 'warehouses',\n placeholder: 'Warehouse',\n },\n {\n key: 'shipment_manifest_id',\n label: 'Shipment Manifest',\n type: 'select',\n optionsSource: 'shipmentManifests',\n placeholder: 'Shipment Manifest',\n },\n {\n key: 'api_request',\n label: 'API Request',\n type: 'boolean',\n options: [\n { value: '1', label: 'Yes' },\n { value: '0', label: 'No' },\n ],\n },\n {\n key: 'is_insured',\n label: 'Insured',\n type: 'boolean',\n options: [\n { value: '1', label: 'Yes' },\n { value: '0', label: 'No' },\n ],\n },\n ],\n};\n\n/**\n * Users (customer list) — performed_action chips + user type select.\n */\nexport const usersFilterConfig: ModuleFilterConfigModel = {\n id: 'users',\n route: ['portal', 'customer', 'all'],\n transport: 'legacy-parallel',\n pagination: { pageParam: 'page', sizeParam: 'size' },\n search: {\n param: 'search',\n label: 'Search',\n placeholder: 'Search',\n },\n date: {\n rangeParams: { from: 'from', to: 'to' },\n fieldParam: 'date',\n fields: [{ value: 'created_at', label: 'Date Created' }],\n },\n sort: {\n param: 'order',\n options: [\n { value: 'asc', label: 'Ascending' },\n { value: 'desc', label: 'Descending' },\n ],\n },\n fields: [\n {\n key: 'performed_action',\n label: 'Performed Action',\n type: 'enum',\n exclusive: true,\n options: [\n { value: 'pending', label: 'Pending', color: '#DBB316' },\n { value: 'approved', label: 'Approved', color: '#25945c' },\n { value: 'rejected', label: 'Rejected', color: '#FF001C' },\n ],\n },\n {\n key: 'type',\n label: 'User Type',\n type: 'select',\n optionsSource: 'static',\n options: [\n { value: 'individual', label: 'Individual' },\n { value: 'business', label: 'Business' },\n ],\n placeholder: 'User Type',\n },\n ],\n};\n\n/**\n * Named-transport example — newer endpoints with direct query keys.\n */\nexport const shipmentTrackingItemFilterConfig: ModuleFilterConfigModel = {\n id: 'shipment-tracking-item-list',\n transport: FilterTransport.Named,\n pagination: { pageParam: 'page', sizeParam: 'size' },\n search: {\n param: 'search',\n label: 'Search',\n placeholder: 'Search',\n },\n date: {\n rangeParams: { from: 'from', to: 'to' },\n fieldParam: 'date',\n fields: [{ value: 'created_at', label: 'Date Created' }],\n },\n fields: [\n {\n key: 'claim_status',\n label: 'Claim Status',\n type: 'enum',\n exclusive: true,\n options: [\n { value: 'open', label: 'Open', color: '#25945c' },\n { value: 'closed', label: 'Closed', color: '#667185' },\n { value: 'pending', label: 'Pending', color: '#DBB316' },\n ],\n },\n ],\n};\n\n/** Seed registry — look up config by module id. */\nexport const FILTER_CONFIGS = {\n 'track-shipments': trackShipmentsFilterConfig,\n 'update-shipments': updateShipmentsFilterConfig,\n users: usersFilterConfig,\n 'shipment-tracking-item-list': shipmentTrackingItemFilterConfig,\n} as const;\n\n/** Module ids present in {@link FILTER_CONFIGS}. */\nexport type FilterConfigId = keyof typeof FILTER_CONFIGS;\n","import type {\n FilterParamsModel,\n FilterStateModel,\n ModuleFilterConfigModel,\n} from './filter-config.model';\nimport { FilterTransport, resolveFilterTransport } from './filter-config.model';\n\n/** Router / HTTP query bag accepted by {@link fromFilterParams}. */\nexport type FilterQueryBag = Record<\n string,\n string | number | null | undefined | readonly string[]\n>;\n\n/**\n * Empty filter state — safe default before hydrate / after reset.\n *\n * Sort defaults to descending (`desc`) so list screens match the usual\n * “newest first” API contract without an explicit Apply.\n *\n * @returns A state with an empty `values` map and `order: 'desc'`.\n */\nexport function emptyFilterState(): FilterStateModel {\n return { values: {}, order: 'desc' };\n}\n\n/**\n * Clone state so drawer edits do not mutate the host until Apply.\n *\n * @param state - Current filter state (or undefined).\n * @returns A shallow copy safe to mutate in the drawer.\n */\nexport function cloneFilterState(state?: FilterStateModel | null): FilterStateModel {\n if (state == null) {\n return emptyFilterState();\n }\n return {\n search: state.search,\n from: state.from,\n to: state.to,\n date: state.date,\n order: state.order,\n page: state.page,\n size: state.size,\n values: { ...state.values },\n };\n}\n\n/**\n * Serialize {@link FilterStateModel} for URL query strings and list API calls.\n *\n * - `legacy-parallel`: emits `filterColumn` / `filterValue` as aligned CSV.\n * - `named`: each selected field key is its own query param.\n *\n * Empty strings and undefined field values are omitted.\n *\n * @param state - Current filter map state.\n * @param config - Module schema (controls transport + shared params).\n * @returns Flat query / API bag ready for HttpParams or the router.\n */\nexport function toFilterParams(\n state: FilterStateModel,\n config: ModuleFilterConfigModel,\n): FilterParamsModel {\n const params: FilterParamsModel = {};\n\n if (state.search != null && state.search !== '') {\n params[config.search?.param ?? 'search'] = state.search;\n }\n if (state.from) {\n params[config.date?.rangeParams.from ?? 'from'] = state.from;\n }\n if (state.to) {\n params[config.date?.rangeParams.to ?? 'to'] = state.to;\n }\n if (state.date) {\n params[config.date?.fieldParam ?? 'date'] = state.date;\n }\n if (state.order) {\n params[config.sort?.param ?? 'order'] = state.order;\n }\n if (state.page != null) {\n params[config.pagination?.pageParam ?? 'page'] = state.page;\n }\n if (state.size != null) {\n params[config.pagination?.sizeParam ?? 'size'] = state.size;\n }\n\n if (resolveFilterTransport(config) === FilterTransport.Named) {\n for (const field of config.fields) {\n const v = state.values[field.key];\n if (v != null && v !== '') {\n params[field.key] = v;\n }\n }\n return params;\n }\n\n // legacy-parallel — only fields that have a value\n const columns: string[] = [];\n const values: string[] = [];\n for (const field of config.fields) {\n const v = state.values[field.key];\n if (v === undefined || v === '') {\n continue;\n }\n columns.push(field.key);\n values.push(String(v));\n }\n if (columns.length) {\n params['filterColumn'] = columns.join(',');\n params['filterValue'] = values.join(',');\n }\n\n return params;\n}\n\n/**\n * Hydrate {@link FilterStateModel} from a flat query / API bag.\n *\n * For `legacy-parallel`, zips `filterColumn` + `filterValue` CSV pairs.\n * Unknown column keys are still restored into `values` so round-trips survive\n * config drift.\n *\n * @param params - Router query params or API query object (stringish values).\n * @param config - Module schema.\n * @returns Hydrated {@link FilterStateModel}.\n */\nexport function fromFilterParams(\n params: FilterQueryBag,\n config: ModuleFilterConfigModel,\n): FilterStateModel {\n const state = emptyFilterState();\n\n const read = (key: string): string | undefined => queryBagValue(params[key]);\n\n state.search = read(config.search?.param ?? 'search');\n state.from = read(config.date?.rangeParams.from ?? 'from');\n state.to = read(config.date?.rangeParams.to ?? 'to');\n state.date = read(config.date?.fieldParam ?? 'date');\n state.order = read(config.sort?.param ?? 'order');\n\n const pageRaw = read(config.pagination?.pageParam ?? 'page');\n const sizeRaw = read(config.pagination?.sizeParam ?? 'size');\n if (pageRaw != null) {\n const n = Number(pageRaw);\n if (!Number.isNaN(n)) {\n state.page = n;\n }\n }\n if (sizeRaw != null) {\n const n = Number(sizeRaw);\n if (!Number.isNaN(n)) {\n state.size = n;\n }\n }\n\n if (resolveFilterTransport(config) === FilterTransport.Named) {\n for (const field of config.fields) {\n const v = read(field.key);\n if (v != null) {\n state.values[field.key] = v;\n }\n }\n return state;\n }\n\n const columns = (read('filterColumn') ?? '')\n .split(',')\n .map((s) => s.trim())\n .filter(Boolean);\n const values = (read('filterValue') ?? '')\n .split(',')\n .map((s) => s.trim());\n\n columns.forEach((key, i) => {\n const v = values[i];\n if (v != null && v !== '') {\n state.values[key] = v;\n }\n });\n\n return state;\n}\n\n/**\n * Query keys this config reads and writes (`search`, `page`, `size`, field\n * keys or `filterColumn` / `filterValue`, etc.).\n *\n * @param config - Module schema.\n * @returns Deduped list of query param names.\n */\nexport function filterQueryKeys(config: ModuleFilterConfigModel): string[] {\n const keys: string[] = [\n config.search?.param ?? 'search',\n config.date?.rangeParams.from ?? 'from',\n config.date?.rangeParams.to ?? 'to',\n config.date?.fieldParam ?? 'date',\n config.sort?.param ?? 'order',\n config.pagination?.pageParam ?? 'page',\n config.pagination?.sizeParam ?? 'size',\n ];\n if (resolveFilterTransport(config) === FilterTransport.Named) {\n keys.push(...config.fields.map((field) => field.key));\n } else {\n keys.push('filterColumn', 'filterValue');\n }\n return [...new Set(keys)];\n}\n\n/**\n * True when the bag contains any list-filter / pagination key this config\n * understands. Used to decide whether to hydrate from the URL.\n *\n * @param params - Router query params or API query object.\n * @param config - Module schema.\n * @returns Whether at least one relevant non-empty param is present.\n */\nexport function hasFilterParams(\n params: FilterQueryBag,\n config: ModuleFilterConfigModel,\n): boolean {\n return filterQueryKeys(config).some((key) => queryBagValue(params[key]) != null);\n}\n\n/**\n * @param raw - One query-bag value.\n * @returns First non-empty string, or undefined.\n */\nfunction queryBagValue(\n raw: FilterQueryBag[string],\n): string | undefined {\n if (raw == null) {\n return undefined;\n }\n if (Array.isArray(raw)) {\n return raw[0] != null && String(raw[0]) !== '' ? String(raw[0]) : undefined;\n }\n const value = String(raw);\n return value === '' ? undefined : value;\n}\n\n/**\n * Drop one field value (column deselected / section clear).\n *\n * @param state - Mutable or immutable state to copy.\n * @param key - {@link FilterFieldModel.key} to clear.\n * @returns Cloned state without that field value.\n */\nexport function clearFilterField(\n state: FilterStateModel,\n key: string,\n): FilterStateModel {\n const next = cloneFilterState(state);\n delete next.values[key];\n return next;\n}\n\n/**\n * Reset to empty values while optionally keeping pagination.\n *\n * @param keepPagination - When true, preserve `page` / `size`.\n * @param state - Optional prior state for pagination retention.\n * @returns Empty filter state, optionally retaining pagination.\n */\nexport function resetFilterState(\n keepPagination = false,\n state?: FilterStateModel | null,\n): FilterStateModel {\n const next = emptyFilterState();\n if (keepPagination && state) {\n next.page = state.page;\n next.size = state.size;\n }\n return next;\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"africanies-africanies-models.mjs","sources":["../../../../libs/africanies-models/src/lib/api/pagination.ts","../../../../libs/africanies-models/src/lib/delivery-vendor/delivery-vendor.ts","../../../../libs/africanies-models/src/lib/filters/filter-config.model.ts","../../../../libs/africanies-models/src/lib/filters/configs/seed-configs.ts","../../../../libs/africanies-models/src/lib/filters/filter-serialize.ts","../../../../libs/africanies-models/src/africanies-africanies-models.ts"],"sourcesContent":["/**\n * Allowed page sizes for list pagination (`size` query param).\n */\nexport const PAGINATION_PAGE_SIZES = [5, 15, 30] as const;\n\n/** One of {@link PAGINATION_PAGE_SIZES}. */\nexport type PaginationPageSize = (typeof PAGINATION_PAGE_SIZES)[number];\n\n/** Default `size` on paginated resource GETs. */\nexport const DEFAULT_PAGE_SIZE: PaginationPageSize = 15;\n\n/** Inbox / notification list page size. */\nexport const NOTIFICATION_PAGE_SIZE: PaginationPageSize = 30;\n","/**\n * Hardcoded inbound delivery vendor slugs — same values as legacy portal forms (no API).\n */\n\nexport /**\n *\n */\nconst DELIVERY_VENDORS = [\n { id: 'amazon', name: 'Amazon' },\n { id: 'dhl', name: 'DHL' },\n { id: 'fedex', name: 'FedEx' },\n { id: 'usps', name: 'USPS' },\n { id: 'ups', name: 'UPS' },\n { id: 'others', name: 'Others' },\n] as const;\n\n/**\n *\n */\nexport type DeliveryVendorId = (typeof DELIVERY_VENDORS)[number]['id'];\n\n/** Export box editor only — not used on inbound receive/edit forms. */\nexport const EXPORT_DELIVERY_VENDORS = [\n ...DELIVERY_VENDORS,\n { id: 'walk-in', name: 'Walk-In' },\n] as const;\n\n/**\n *\n */\nexport type ExportDeliveryVendorId =\n (typeof EXPORT_DELIVERY_VENDORS)[number]['id'];\n\n/** @deprecated Prefer {@link DELIVERY_VENDORS}. */\nexport const DELIVERY_VENDOR_OPTIONS = DELIVERY_VENDORS.map((row) => ({\n value: row.id,\n label: row.name,\n}));\n\n/** @deprecated Prefer {@link EXPORT_DELIVERY_VENDORS}. */\nexport const BOX_DELIVERY_VENDORS = EXPORT_DELIVERY_VENDORS;\n\n/** @deprecated Prefer {@link ExportDeliveryVendorId}. */\nexport type BoxDeliveryVendorId = ExportDeliveryVendorId;\n\nconst VENDOR_LABELS = Object.fromEntries(\n DELIVERY_VENDORS.map((row) => [row.id, row.name]),\n) as Record<DeliveryVendorId, string>;\n\n/**\n *\n * @param value\n */\nexport function normalizeDeliveryVendor(value: string): string {\n return value.trim().toLowerCase();\n}\n\n/**\n *\n * @param value\n */\nexport function isKnownDeliveryVendor(\n value: string | null | undefined,\n): boolean {\n const normalized = normalizeDeliveryVendor(value ?? '');\n if (!normalized) {\n return false;\n }\n return DELIVERY_VENDORS.some((vendor) => vendor.id === normalized);\n}\n\n/**\n * Lowercase known ids; keep raw string for legacy/custom stored values.\n * @param value\n */\nexport function normalizeDeliveryVendorForForm(\n value: string | null | undefined,\n): string {\n const raw = value?.trim() ?? '';\n if (!raw) {\n return '';\n }\n const normalized = normalizeDeliveryVendor(raw);\n if (isKnownDeliveryVendor(normalized)) {\n return normalized;\n }\n return raw;\n}\n\n/**\n *\n * @param value\n */\nexport function deliveryVendorLabel(value: string): string {\n const normalized = normalizeDeliveryVendor(value);\n if (!normalized || normalized === 'others') {\n return '';\n }\n return VENDOR_LABELS[normalized as DeliveryVendorId] ?? value.trim();\n}\n","/**\n * Schema-driven list filter contracts for AFRICANIES modules.\n *\n * Modules declare a {@link ModuleFilterConfigModel}; the UI drawer renders from\n * it and {@link toFilterParams} / {@link fromFilterParams} speak to the API.\n */\n\n/**\n * Backend wire format for filter query serialization.\n *\n * Use {@link resolveFilterTransport} when reading `config.transport` — omit the\n * property on {@link ModuleFilterConfigModel} to default to legacy-parallel.\n */\nexport const FilterTransport = {\n /** Laravel-style `filterColumn` + `filterValue` CSV pairs (default). */\n LegacyParallel: 'legacy-parallel',\n /** Each {@link FilterFieldModel.key} is its own query param. */\n Named: 'named',\n} as const;\n\n/** Union of {@link FilterTransport} literal values. */\nexport type FilterTransport =\n (typeof FilterTransport)[keyof typeof FilterTransport];\n\n/** Default when {@link ModuleFilterConfigModel.transport} is omitted. */\nexport const DEFAULT_FILTER_TRANSPORT = FilterTransport.LegacyParallel;\n\n/** How a filter field is rendered and validated in the drawer. */\nexport type FilterFieldType =\n /** Chip / single-select group — exclusive within the field by default. */\n | 'enum'\n /** Free-text scalar (tracking number, etc.). */\n | 'text'\n /** Static or host-resolved option list (warehouse, carrier, …). */\n | 'select'\n /** Yes/no mapped to API scalars (often `'1'` / `'0'`). */\n | 'boolean';\n\n/**\n * Option row for enum / select / boolean fields.\n *\n * `color` is a UI hint only (chip styling) — never sent to the API.\n */\nexport interface FilterOptionModel {\n /** Canonical value written into filter state / query params. */\n value: string;\n /** Visible label. */\n label: string;\n /** Optional leading text/emoji (e.g. country flag emoji) in select rows. */\n prefixText?: string;\n /** Optional leading image URL (e.g. flag CDN from {@link countryFlagUrl}). */\n prefixImageUrl?: string;\n /** Optional chip / badge color (hex or CSS). */\n color?: string;\n}\n\n/**\n * Well-known async option catalogs resolved by the SDK or host app.\n *\n * Built-in wiring ({@link FilterOptionsResolver} in `@africanies/africanies-core`):\n * - `warehouses` → {@link WarehouseService.readAll} → field keys like `warehouse_id`\n * - `shipmentMethods` → {@link ShipmentMethodService.readAll} → e.g. `shipment_method_id`\n *\n * Pass host `optionLists` for sources without a built-in service (e.g. `shipmentManifests`).\n */\nexport type FilterOptionsSource =\n | 'shipmentMethods'\n | 'warehouses'\n | 'shipmentManifests'\n | 'static';\n\n/**\n * One filterable API field inside a {@link ModuleFilterConfigModel}.\n */\nexport interface FilterFieldModel {\n /** API `filterColumn` name (e.g. `payment_status`). */\n key: string;\n /** Drawer section label. */\n label: string;\n /** Control kind. */\n type: FilterFieldType;\n /** Static options (enum / boolean / static select). */\n options?: FilterOptionModel[];\n /**\n * When true (default for `enum`), selecting a value replaces any prior value\n * for this key — chip groups are mutually exclusive per field.\n */\n exclusive?: boolean;\n /** Host-resolved option catalog name for `select` fields. */\n optionsSource?: FilterOptionsSource;\n /** Placeholder for text / select triggers. */\n placeholder?: string;\n}\n\n/**\n * Module-level filter schema — the only per-module difference for list filters.\n *\n * @example\n * ```ts\n * const trackShipmentsFilterConfig: ModuleFilterConfigModel = {\n * id: 'track-shipments',\n * // transport omitted → FilterTransport.LegacyParallel\n * fields: [\n * { key: 'payment_status', label: 'Payment Status', type: 'enum', options: […] },\n * ],\n * };\n * ```\n */\nexport interface ModuleFilterConfigModel {\n /** Stable module id (`track-shipments`, `users`, …). */\n id: string;\n /**\n * Optional portal route segments for docs / deep links\n * (e.g. `['portal', 'shipment', 'track-shipments']`).\n */\n route?: string[];\n /** Free-text search box. */\n search?: {\n param: 'search';\n label: string;\n placeholder?: string;\n };\n /** Date range + which date column the range applies to. */\n date?: {\n rangeParams: { from: 'from'; to: 'to' };\n fieldParam: 'date';\n fields: FilterOptionModel[];\n };\n /** Sort direction control. */\n sort?: {\n param: 'order';\n options: FilterOptionModel[];\n };\n /** Pagination query param names (defaults when omitted at serialize time). */\n pagination?: {\n pageParam: 'page';\n sizeParam: 'size';\n };\n /** Filterable fields rendered in the drawer. */\n fields: FilterFieldModel[];\n /**\n * Backend wire format — see {@link FilterTransport}.\n * Defaults to {@link DEFAULT_FILTER_TRANSPORT} when omitted.\n */\n transport?: FilterTransport;\n}\n\n/**\n * Preferred UI / feature state for filters.\n *\n * Keep values as a map keyed by {@link FilterFieldModel.key}; only flatten to\n * parallel comma strings at the API / URL boundary.\n */\nexport interface FilterStateModel {\n search?: string;\n /** Inclusive range start (`YYYY-MM-DD`). */\n from?: string;\n /** Inclusive range end (`YYYY-MM-DD`). */\n to?: string;\n /** Which date column `from`/`to` apply to (`created_at`, …). */\n date?: string;\n order?: 'asc' | 'desc' | string;\n page?: number;\n size?: number;\n /**\n * Field values keyed by {@link FilterFieldModel.key}.\n * Omit or set `undefined` / `''` to exclude from serialization.\n */\n values: Record<string, string | undefined>;\n}\n\n/**\n * Flat query / API bag produced by {@link toFilterParams}.\n * Values are strings (or numbers for page/size) ready for HttpParams / router.\n */\nexport type FilterParamsModel = Record<string, string | number | undefined>;\n\n/**\n * Resolved transport for a module config (defaults to {@link DEFAULT_FILTER_TRANSPORT}).\n * @param config\n */\nexport function resolveFilterTransport(\n config: Pick<ModuleFilterConfigModel, 'transport'>,\n): FilterTransport {\n return config.transport ?? DEFAULT_FILTER_TRANSPORT;\n}\n","import type { ModuleFilterConfigModel } from '../filter-config.model';\nimport { FilterTransport } from '../filter-config.model';\n\n/**\n * Track shipments — payment / shipment status chips + tracking number.\n * Transport: legacy `filterColumn` / `filterValue`.\n */\nexport const trackShipmentsFilterConfig: ModuleFilterConfigModel = {\n id: 'track-shipments',\n route: ['portal', 'shipment', 'track-shipments'],\n transport: 'legacy-parallel',\n pagination: { pageParam: 'page', sizeParam: 'size' },\n search: {\n param: 'search',\n label: 'Shipment ID',\n placeholder: 'Search',\n },\n date: {\n rangeParams: { from: 'from', to: 'to' },\n fieldParam: 'date',\n fields: [{ value: 'created_at', label: 'Date Created' }],\n },\n sort: {\n param: 'order',\n options: [\n { value: 'asc', label: 'Ascending' },\n { value: 'desc', label: 'Descending' },\n ],\n },\n fields: [\n {\n key: 'payment_status',\n label: 'Payment Status',\n type: 'enum',\n exclusive: true,\n options: [\n { value: 'paid', label: 'Paid', color: '#25945c' },\n { value: 'unpaid', label: 'Unpaid', color: '#f48220' },\n ],\n },\n {\n key: 'shipment_status',\n label: 'Shipment Status',\n type: 'enum',\n exclusive: true,\n options: [\n { value: 'pending', label: 'Pending', color: '#DBB316' },\n { value: 'in-process', label: 'In Process', color: '#3B82F6' },\n { value: 'completed', label: 'Completed', color: '#25945c' },\n ],\n },\n {\n key: 'tracking_number',\n label: 'Tracking Number',\n type: 'text',\n placeholder: 'Search',\n },\n ],\n};\n\n/**\n * Update shipments — richest legacy filter set (enums + entity selects + booleans).\n */\nexport const updateShipmentsFilterConfig: ModuleFilterConfigModel = {\n id: 'update-shipments',\n route: ['portal', 'shipment', 'update-shipments'],\n transport: 'legacy-parallel',\n pagination: { pageParam: 'page', sizeParam: 'size' },\n search: {\n param: 'search',\n label: 'Shipment ID',\n placeholder: 'Search',\n },\n date: {\n rangeParams: { from: 'from', to: 'to' },\n fieldParam: 'date',\n fields: [\n { value: 'created_at', label: 'Date Created' },\n { value: 'paid_at', label: 'Date of Payment' },\n { value: 'packaged_at', label: 'Date Packaged' },\n { value: 'shipment_processed_at', label: 'Date Processed' },\n ],\n },\n sort: {\n param: 'order',\n options: [\n { value: 'asc', label: 'Ascending' },\n { value: 'desc', label: 'Descending' },\n ],\n },\n fields: [\n {\n key: 'payment_status',\n label: 'Payment Status',\n type: 'enum',\n exclusive: true,\n options: [\n { value: 'paid', label: 'Paid', color: '#25945c' },\n { value: 'unpaid', label: 'Unpaid', color: '#f48220' },\n ],\n },\n {\n key: 'shipment_status',\n label: 'Shipment Status',\n type: 'enum',\n exclusive: true,\n options: [\n { value: 'pending', label: 'Pending', color: '#DBB316' },\n { value: 'in-process', label: 'In Process', color: '#3B82F6' },\n { value: 'completed', label: 'Completed', color: '#25945c' },\n ],\n },\n {\n key: 'type',\n label: 'Shipment Type',\n type: 'enum',\n exclusive: true,\n options: [\n { value: 'shipment', label: 'Shipment', color: '#3B82F6' },\n { value: 'etw_shipment', label: 'ETW Shipment', color: '#8B5CF6' },\n ],\n },\n {\n key: 'shipment_method_id',\n label: 'Shipment Methods',\n type: 'select',\n optionsSource: 'shipmentMethods',\n placeholder: 'Shipment Methods',\n },\n {\n key: 'type_of_user',\n label: 'User Type',\n type: 'select',\n optionsSource: 'static',\n options: [\n { value: '', label: 'None' },\n { value: 'individual', label: 'Individual' },\n { value: 'business', label: 'Business' },\n ],\n placeholder: 'User Type',\n },\n {\n key: 'warehouse_id',\n label: 'Warehouse',\n type: 'select',\n optionsSource: 'warehouses',\n placeholder: 'Warehouse',\n },\n {\n key: 'shipment_manifest_id',\n label: 'Shipment Manifest',\n type: 'enum',\n exclusive: true,\n options: [\n { value: 'not_null', label: 'Manifest Added', color: '#25945c' },\n { value: 'null', label: 'Manifest Not Added', color: '#667185' },\n ],\n },\n {\n key: 'api_request',\n label: 'API Request',\n type: 'boolean',\n options: [\n { value: '1', label: 'Yes', color: '#25945c' },\n { value: '0', label: 'No', color: '#FF001C' },\n ],\n },\n {\n key: 'is_insured',\n label: 'Insured',\n type: 'boolean',\n options: [\n { value: '1', label: 'Yes', color: '#3B82F6' },\n { value: '0', label: 'No', color: '#f48220' },\n ],\n },\n {\n key: 'pay_later',\n label: 'Pay Later',\n type: 'enum',\n exclusive: true,\n options: [\n { value: 'credit', label: 'Credit', color: '#25945c' },\n { value: 'debit', label: 'Debit', color: '#667185' },\n ],\n },\n ],\n};\n\n/**\n * Users (customer list) — performed_action chips + user type select.\n */\nexport const usersFilterConfig: ModuleFilterConfigModel = {\n id: 'users',\n route: ['portal', 'customer', 'all'],\n transport: 'legacy-parallel',\n pagination: { pageParam: 'page', sizeParam: 'size' },\n search: {\n param: 'search',\n label: 'Search',\n placeholder: 'Search',\n },\n date: {\n rangeParams: { from: 'from', to: 'to' },\n fieldParam: 'date',\n fields: [{ value: 'created_at', label: 'Date Created' }],\n },\n sort: {\n param: 'order',\n options: [\n { value: 'asc', label: 'Ascending' },\n { value: 'desc', label: 'Descending' },\n ],\n },\n fields: [\n {\n key: 'performed_action',\n label: 'Performed Action',\n type: 'enum',\n exclusive: true,\n options: [\n { value: 'pending', label: 'Pending', color: '#DBB316' },\n { value: 'approved', label: 'Approved', color: '#25945c' },\n { value: 'rejected', label: 'Rejected', color: '#FF001C' },\n ],\n },\n {\n key: 'type',\n label: 'User Type',\n type: 'select',\n optionsSource: 'static',\n options: [\n { value: 'individual', label: 'Individual' },\n { value: 'business', label: 'Business' },\n ],\n placeholder: 'User Type',\n },\n ],\n};\n\n/**\n * Named-transport example — newer endpoints with direct query keys.\n */\nexport const shipmentTrackingItemFilterConfig: ModuleFilterConfigModel = {\n id: 'shipment-tracking-item-list',\n transport: FilterTransport.Named,\n pagination: { pageParam: 'page', sizeParam: 'size' },\n search: {\n param: 'search',\n label: 'Search',\n placeholder: 'Search',\n },\n date: {\n rangeParams: { from: 'from', to: 'to' },\n fieldParam: 'date',\n fields: [{ value: 'created_at', label: 'Date Created' }],\n },\n fields: [\n {\n key: 'claim_status',\n label: 'Claim Status',\n type: 'enum',\n exclusive: true,\n options: [\n { value: 'open', label: 'Open', color: '#25945c' },\n { value: 'closed', label: 'Closed', color: '#667185' },\n { value: 'pending', label: 'Pending', color: '#DBB316' },\n ],\n },\n ],\n};\n\n/** Seed registry — look up config by module id. */\nexport const FILTER_CONFIGS = {\n 'track-shipments': trackShipmentsFilterConfig,\n 'update-shipments': updateShipmentsFilterConfig,\n users: usersFilterConfig,\n 'shipment-tracking-item-list': shipmentTrackingItemFilterConfig,\n} as const;\n\n/** Module ids present in {@link FILTER_CONFIGS}. */\nexport type FilterConfigId = keyof typeof FILTER_CONFIGS;\n","import type {\n FilterParamsModel,\n FilterStateModel,\n ModuleFilterConfigModel,\n} from './filter-config.model';\nimport { FilterTransport, resolveFilterTransport } from './filter-config.model';\n\n/** Router / HTTP query bag accepted by {@link fromFilterParams}. */\nexport type FilterQueryBag = Record<\n string,\n string | number | null | undefined | readonly string[]\n>;\n\n/**\n * Empty filter state — safe default before hydrate / after reset.\n *\n * Sort defaults to descending (`desc`) so list screens match the usual\n * “newest first” API contract without an explicit Apply.\n *\n * @returns A state with an empty `values` map and `order: 'desc'`.\n */\nexport function emptyFilterState(): FilterStateModel {\n return { values: {}, order: 'desc' };\n}\n\n/**\n * Clone state so drawer edits do not mutate the host until Apply.\n *\n * @param state - Current filter state (or undefined).\n * @returns A shallow copy safe to mutate in the drawer.\n */\nexport function cloneFilterState(state?: FilterStateModel | null): FilterStateModel {\n if (state == null) {\n return emptyFilterState();\n }\n return {\n search: state.search,\n from: state.from,\n to: state.to,\n date: state.date,\n order: state.order,\n page: state.page,\n size: state.size,\n values: { ...state.values },\n };\n}\n\n/**\n * Serialize {@link FilterStateModel} for URL query strings and list API calls.\n *\n * - `legacy-parallel`: emits `filterColumn` / `filterValue` as aligned CSV.\n * - `named`: each selected field key is its own query param.\n *\n * Empty strings and undefined field values are omitted.\n *\n * @param state - Current filter map state.\n * @param config - Module schema (controls transport + shared params).\n * @returns Flat query / API bag ready for HttpParams or the router.\n */\nexport function toFilterParams(\n state: FilterStateModel,\n config: ModuleFilterConfigModel,\n): FilterParamsModel {\n const params: FilterParamsModel = {};\n\n if (state.search != null && state.search !== '') {\n params[config.search?.param ?? 'search'] = state.search;\n }\n if (state.from) {\n params[config.date?.rangeParams.from ?? 'from'] = state.from;\n }\n if (state.to) {\n params[config.date?.rangeParams.to ?? 'to'] = state.to;\n }\n if (state.date) {\n params[config.date?.fieldParam ?? 'date'] = state.date;\n }\n if (state.order) {\n params[config.sort?.param ?? 'order'] = state.order;\n }\n if (state.page != null) {\n params[config.pagination?.pageParam ?? 'page'] = state.page;\n }\n if (state.size != null) {\n params[config.pagination?.sizeParam ?? 'size'] = state.size;\n }\n\n if (resolveFilterTransport(config) === FilterTransport.Named) {\n for (const field of config.fields) {\n const v = state.values[field.key];\n if (v != null && v !== '') {\n params[field.key] = v;\n }\n }\n return params;\n }\n\n // legacy-parallel — only fields that have a value\n const columns: string[] = [];\n const values: string[] = [];\n for (const field of config.fields) {\n const v = state.values[field.key];\n if (v === undefined || v === '') {\n continue;\n }\n columns.push(field.key);\n values.push(String(v));\n }\n if (columns.length) {\n params['filterColumn'] = columns.join(',');\n params['filterValue'] = values.join(',');\n }\n\n return params;\n}\n\n/**\n * Hydrate {@link FilterStateModel} from a flat query / API bag.\n *\n * For `legacy-parallel`, zips `filterColumn` + `filterValue` CSV pairs.\n * Unknown column keys are still restored into `values` so round-trips survive\n * config drift.\n *\n * @param params - Router query params or API query object (stringish values).\n * @param config - Module schema.\n * @returns Hydrated {@link FilterStateModel}.\n */\nexport function fromFilterParams(\n params: FilterQueryBag,\n config: ModuleFilterConfigModel,\n): FilterStateModel {\n const state = emptyFilterState();\n\n const read = (key: string): string | undefined => queryBagValue(params[key]);\n\n state.search = read(config.search?.param ?? 'search');\n state.from = read(config.date?.rangeParams.from ?? 'from');\n state.to = read(config.date?.rangeParams.to ?? 'to');\n state.date = read(config.date?.fieldParam ?? 'date');\n state.order = read(config.sort?.param ?? 'order');\n\n const pageRaw = read(config.pagination?.pageParam ?? 'page');\n const sizeRaw = read(config.pagination?.sizeParam ?? 'size');\n if (pageRaw != null) {\n const n = Number(pageRaw);\n if (!Number.isNaN(n)) {\n state.page = n;\n }\n }\n if (sizeRaw != null) {\n const n = Number(sizeRaw);\n if (!Number.isNaN(n)) {\n state.size = n;\n }\n }\n\n if (resolveFilterTransport(config) === FilterTransport.Named) {\n for (const field of config.fields) {\n const v = read(field.key);\n if (v != null) {\n state.values[field.key] = v;\n }\n }\n return state;\n }\n\n const columns = (read('filterColumn') ?? '')\n .split(',')\n .map((s) => s.trim())\n .filter(Boolean);\n const values = (read('filterValue') ?? '')\n .split(',')\n .map((s) => s.trim());\n\n columns.forEach((key, i) => {\n const v = values[i];\n if (v != null && v !== '') {\n state.values[key] = v;\n }\n });\n\n return state;\n}\n\n/**\n * Query keys this config reads and writes (`search`, `page`, `size`, field\n * keys or `filterColumn` / `filterValue`, etc.).\n *\n * @param config - Module schema.\n * @returns Deduped list of query param names.\n */\nexport function filterQueryKeys(config: ModuleFilterConfigModel): string[] {\n const keys: string[] = [\n config.search?.param ?? 'search',\n config.date?.rangeParams.from ?? 'from',\n config.date?.rangeParams.to ?? 'to',\n config.date?.fieldParam ?? 'date',\n config.sort?.param ?? 'order',\n config.pagination?.pageParam ?? 'page',\n config.pagination?.sizeParam ?? 'size',\n ];\n if (resolveFilterTransport(config) === FilterTransport.Named) {\n keys.push(...config.fields.map((field) => field.key));\n } else {\n keys.push('filterColumn', 'filterValue');\n }\n return [...new Set(keys)];\n}\n\n/**\n * True when the bag contains any list-filter / pagination key this config\n * understands. Used to decide whether to hydrate from the URL.\n *\n * @param params - Router query params or API query object.\n * @param config - Module schema.\n * @returns Whether at least one relevant non-empty param is present.\n */\nexport function hasFilterParams(\n params: FilterQueryBag,\n config: ModuleFilterConfigModel,\n): boolean {\n return filterQueryKeys(config).some((key) => queryBagValue(params[key]) != null);\n}\n\n/**\n * @param raw - One query-bag value.\n * @returns First non-empty string, or undefined.\n */\nfunction queryBagValue(\n raw: FilterQueryBag[string],\n): string | undefined {\n if (raw == null) {\n return undefined;\n }\n if (Array.isArray(raw)) {\n return raw[0] != null && String(raw[0]) !== '' ? String(raw[0]) : undefined;\n }\n const value = String(raw);\n return value === '' ? undefined : value;\n}\n\n/**\n * Drop one field value (column deselected / section clear).\n *\n * @param state - Mutable or immutable state to copy.\n * @param key - {@link FilterFieldModel.key} to clear.\n * @returns Cloned state without that field value.\n */\nexport function clearFilterField(\n state: FilterStateModel,\n key: string,\n): FilterStateModel {\n const next = cloneFilterState(state);\n delete next.values[key];\n return next;\n}\n\n/**\n * Reset to empty values while optionally keeping pagination.\n *\n * @param keepPagination - When true, preserve `page` / `size`.\n * @param state - Optional prior state for pagination retention.\n * @returns Empty filter state, optionally retaining pagination.\n */\nexport function resetFilterState(\n keepPagination = false,\n state?: FilterStateModel | null,\n): FilterStateModel {\n const next = emptyFilterState();\n if (keepPagination && state) {\n next.page = state.page;\n next.size = state.size;\n }\n return next;\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -15,36 +15,54 @@ import { STORAGE_TOKEN, AFRICANIES_THEME_KEY } from '@africanies/africanies-stor
|
|
|
15
15
|
* Do not rename these strings without updating ModeColorService and THEME.md.
|
|
16
16
|
*
|
|
17
17
|
* SFN (export / green):
|
|
18
|
+
* text-export-strong bg-export-strong hover:bg-export-hover border-export-strong
|
|
18
19
|
* text-export bg-export bg-export-subtle bg-export-light border-export
|
|
19
20
|
* hover:bg-export-light hover:bg-export-subtle dark:bg-export/15 dark:hover:bg-export/15
|
|
20
|
-
* dark:bg-[color-mix(in_srgb,#1cbd5d_15%,#212529)]
|
|
21
|
+
* dark:bg-[color-mix(in_srgb,#1cbd5d_15%,#212529)] dark:bg-export dark:text-export dark:border-export
|
|
21
22
|
*
|
|
22
23
|
* STN (import / orange):
|
|
24
|
+
* text-import-strong bg-import-strong hover:bg-import-hover border-import-strong
|
|
23
25
|
* text-import bg-import bg-import-subtle bg-import-light border-import
|
|
24
26
|
* hover:bg-import-light hover:bg-import-subtle dark:bg-import/15 dark:hover:bg-import/15
|
|
25
|
-
* dark:bg-[color-mix(in_srgb,#f08829_15%,#212529)]
|
|
27
|
+
* dark:bg-[color-mix(in_srgb,#f08829_15%,#212529)] dark:bg-import dark:text-import dark:border-import
|
|
26
28
|
*/
|
|
27
29
|
const MODE_COLOR_SAFELIST = [
|
|
28
30
|
'text-export',
|
|
31
|
+
'text-export-strong',
|
|
29
32
|
'bg-export',
|
|
33
|
+
'bg-export-strong',
|
|
30
34
|
'bg-export-subtle',
|
|
31
35
|
'bg-export-light',
|
|
32
36
|
'border-export',
|
|
37
|
+
'border-export-strong',
|
|
38
|
+
'hover:bg-export-hover',
|
|
33
39
|
'hover:bg-export-light',
|
|
34
40
|
'hover:bg-export-subtle',
|
|
35
41
|
'dark:bg-export/15',
|
|
36
42
|
'dark:hover:bg-export/15',
|
|
43
|
+
'dark:hover:bg-export-light',
|
|
37
44
|
'dark:bg-[color-mix(in_srgb,#1cbd5d_15%,#212529)]',
|
|
45
|
+
'dark:bg-export',
|
|
46
|
+
'dark:text-export',
|
|
47
|
+
'dark:border-export',
|
|
38
48
|
'text-import',
|
|
49
|
+
'text-import-strong',
|
|
39
50
|
'bg-import',
|
|
51
|
+
'bg-import-strong',
|
|
40
52
|
'bg-import-subtle',
|
|
41
53
|
'bg-import-light',
|
|
42
54
|
'border-import',
|
|
55
|
+
'border-import-strong',
|
|
56
|
+
'hover:bg-import-hover',
|
|
43
57
|
'hover:bg-import-light',
|
|
44
58
|
'hover:bg-import-subtle',
|
|
45
59
|
'dark:bg-import/15',
|
|
46
60
|
'dark:hover:bg-import/15',
|
|
61
|
+
'dark:hover:bg-import-light',
|
|
47
62
|
'dark:bg-[color-mix(in_srgb,#f08829_15%,#212529)]',
|
|
63
|
+
'dark:bg-import',
|
|
64
|
+
'dark:text-import',
|
|
65
|
+
'dark:border-import',
|
|
48
66
|
];
|
|
49
67
|
|
|
50
68
|
/**
|
|
@@ -73,27 +91,31 @@ class ModeColorService {
|
|
|
73
91
|
// Literal strings required for Tailwind content detection — do not interpolate.
|
|
74
92
|
if (this.shippingMode.mode() === 'sfn') {
|
|
75
93
|
return {
|
|
76
|
-
text: 'text-export',
|
|
94
|
+
text: 'text-export-strong dark:text-export',
|
|
77
95
|
bg: 'bg-export',
|
|
78
96
|
bgSubtle: 'bg-export-subtle',
|
|
79
97
|
border: 'border-export',
|
|
80
|
-
primary: 'bg-export text-white border-transparent hover:bg-export-light',
|
|
81
|
-
ghostPrimary: 'bg-transparent text-export border-transparent hover:bg-export-subtle dark:hover:bg-export/15',
|
|
98
|
+
primary: 'bg-export-strong text-white border-transparent hover:bg-export-hover dark:bg-export dark:hover:bg-export-light',
|
|
99
|
+
ghostPrimary: 'bg-transparent text-export-strong border-transparent hover:bg-export-subtle dark:text-export dark:hover:bg-export/15',
|
|
82
100
|
soft: 'bg-export-subtle dark:bg-export/15',
|
|
83
101
|
softSolid: 'bg-export-subtle dark:bg-[color-mix(in_srgb,#1cbd5d_15%,#212529)]',
|
|
84
102
|
softHover: 'hover:bg-export-subtle dark:hover:bg-export/15',
|
|
103
|
+
activeFill: 'bg-export-strong text-white border-transparent hover:bg-export-hover dark:bg-export dark:text-white dark:hover:bg-export-light',
|
|
104
|
+
stroked: 'bg-surface text-export-strong border-export-strong hover:bg-export-subtle dark:bg-ink-950 dark:text-export dark:border-export dark:hover:bg-export/15',
|
|
85
105
|
};
|
|
86
106
|
}
|
|
87
107
|
return {
|
|
88
|
-
text: 'text-import',
|
|
108
|
+
text: 'text-import-strong dark:text-import',
|
|
89
109
|
bg: 'bg-import',
|
|
90
110
|
bgSubtle: 'bg-import-subtle',
|
|
91
111
|
border: 'border-import',
|
|
92
|
-
primary: 'bg-import text-white border-transparent hover:bg-import-light',
|
|
93
|
-
ghostPrimary: 'bg-transparent text-import border-transparent hover:bg-import-subtle dark:hover:bg-import/15',
|
|
112
|
+
primary: 'bg-import-strong text-white border-transparent hover:bg-import-hover dark:bg-import dark:hover:bg-import-light',
|
|
113
|
+
ghostPrimary: 'bg-transparent text-import-strong border-transparent hover:bg-import-subtle dark:text-import dark:hover:bg-import/15',
|
|
94
114
|
soft: 'bg-import-subtle dark:bg-import/15',
|
|
95
115
|
softSolid: 'bg-import-subtle dark:bg-[color-mix(in_srgb,#f08829_15%,#212529)]',
|
|
96
116
|
softHover: 'hover:bg-import-subtle dark:hover:bg-import/15',
|
|
117
|
+
activeFill: 'bg-import-strong text-white border-transparent hover:bg-import-hover dark:bg-import dark:text-white dark:hover:bg-import-light',
|
|
118
|
+
stroked: 'bg-surface text-import-strong border-import-strong hover:bg-import-subtle dark:bg-ink-950 dark:text-import dark:border-import dark:hover:bg-import/15',
|
|
97
119
|
};
|
|
98
120
|
}, /* @ts-ignore */
|
|
99
121
|
...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"africanies-africanies-theme.mjs","sources":["../../../../libs/africanies-theme/src/lib/mode-color.safelist.ts","../../../../libs/africanies-theme/src/lib/mode-color.service.ts","../../../../libs/africanies-theme/src/lib/theme.service.ts","../../../../libs/africanies-theme/src/africanies-africanies-theme.ts"],"sourcesContent":["/**\n * Tailwind safelist side-effect for shipping-mode color utilities.\n *\n * WHY this file exists: JIT/content scanning only keeps class names that appear\n * as *literal strings* in scanned sources. {@link ModeColorService} already\n * returns these literals, but keeping a dedicated comment list makes the\n * contract obvious for consumers who configure `safelist` or purge plugins.\n *\n * Do not rename these strings without updating ModeColorService and THEME.md.\n *\n * SFN (export / green):\n * text-export bg-export bg-export-subtle bg-export-light border-export\n * hover:bg-export-light hover:bg-export-subtle dark:bg-export/15 dark:hover:bg-export/15\n * dark:bg-[color-mix(in_srgb,#1cbd5d_15%,#212529)]\n *\n * STN (import / orange):\n * text-import bg-import bg-import-subtle bg-import-light border-import\n * hover:bg-import-light hover:bg-import-subtle dark:bg-import/15 dark:hover:bg-import/15\n * dark:bg-[color-mix(in_srgb,#f08829_15%,#212529)]\n */\nexport const MODE_COLOR_SAFELIST = [\n 'text-export',\n 'bg-export',\n 'bg-export-subtle',\n 'bg-export-light',\n 'border-export',\n 'hover:bg-export-light',\n 'hover:bg-export-subtle',\n 'dark:bg-export/15',\n 'dark:hover:bg-export/15',\n 'dark:bg-[color-mix(in_srgb,#1cbd5d_15%,#212529)]',\n 'text-import',\n 'bg-import',\n 'bg-import-subtle',\n 'bg-import-light',\n 'border-import',\n 'hover:bg-import-light',\n 'hover:bg-import-subtle',\n 'dark:bg-import/15',\n 'dark:hover:bg-import/15',\n 'dark:bg-[color-mix(in_srgb,#f08829_15%,#212529)]',\n] as const;\n","import { computed, inject, Injectable } from '@angular/core';\n\nimport { ShippingModeService } from '@africanies/africanies-core';\n\n/**\n * Tailwind class bundle for the active shipping mode (SFN export / STN import).\n *\n * Use these for **primary** product chrome: CTAs, selected controls, progress,\n * and accent text. Semantic colors (danger / warning) stay mode-independent.\n */\nexport interface ModeColorClasses {\n /** Text color utility, e.g. `text-export`. */\n text: string;\n /** Solid background utility, e.g. `bg-export`. */\n bg: string;\n /** Soft background utility, e.g. `bg-export-subtle`. */\n bgSubtle: string;\n /** Border matching the mode accent, e.g. `border-export`. */\n border: string;\n /**\n * Filled primary CTA — `variant=\"primary\"` on buttons.\n * Includes hover utility as a literal so Tailwind keeps it.\n */\n primary: string;\n /**\n * Transparent / text-only CTA — `variant=\"ghost-primary\"` on buttons.\n * Mode accent text + soft hover fill.\n */\n ghostPrimary: string;\n /**\n * Soft highlight for selected / active rows (works in dark mode).\n * Dark uses a translucent tint — fine over solid surfaces, not for\n * sticky overlays (see {@link softSolid}).\n */\n soft: string;\n /**\n * Opaque soft fill — same tint as {@link soft}, but dark mode mixes into\n * ink so scrolled content cannot show through (sticky table headers/cells).\n */\n softSolid: string;\n /**\n * Soft hover highlight for menus and lists.\n */\n softHover: string;\n}\n\n/**\n * Maps {@link ShippingModeService} to mode-accent Tailwind classes.\n *\n * - **SFN** → export green is primary\n * - **STN** → import orange is primary\n *\n * WHY literal class strings: Tailwind's scanner cannot see dynamically built\n * names like `` `text-${token}` ``. Returning full literals (`text-export`, …)\n * keeps utilities in the compiled CSS. See {@link MODE_COLOR_SAFELIST}.\n *\n * @example\n * ```html\n * @let colors = modeColor.classes();\n * <button type=\"button\" [class]=\"colors.primary\">Save</button>\n * <span [class]=\"colors.text\">Mode accent</span>\n * ```\n */\n@Injectable({ providedIn: 'root' })\nexport class ModeColorService {\n private readonly shippingMode = inject(ShippingModeService);\n\n /**\n * Mode-dependent utility classes. Recomputes when shipping mode changes.\n */\n readonly classes = computed<ModeColorClasses>(() => {\n // Literal strings required for Tailwind content detection — do not interpolate.\n if (this.shippingMode.mode() === 'sfn') {\n return {\n text: 'text-export',\n bg: 'bg-export',\n bgSubtle: 'bg-export-subtle',\n border: 'border-export',\n primary:\n 'bg-export text-white border-transparent hover:bg-export-light',\n ghostPrimary:\n 'bg-transparent text-export border-transparent hover:bg-export-subtle dark:hover:bg-export/15',\n soft: 'bg-export-subtle dark:bg-export/15',\n softSolid:\n 'bg-export-subtle dark:bg-[color-mix(in_srgb,#1cbd5d_15%,#212529)]',\n softHover: 'hover:bg-export-subtle dark:hover:bg-export/15',\n };\n }\n return {\n text: 'text-import',\n bg: 'bg-import',\n bgSubtle: 'bg-import-subtle',\n border: 'border-import',\n primary:\n 'bg-import text-white border-transparent hover:bg-import-light',\n ghostPrimary:\n 'bg-transparent text-import border-transparent hover:bg-import-subtle dark:hover:bg-import/15',\n soft: 'bg-import-subtle dark:bg-import/15',\n softSolid:\n 'bg-import-subtle dark:bg-[color-mix(in_srgb,#f08829_15%,#212529)]',\n softHover: 'hover:bg-import-subtle dark:hover:bg-import/15',\n };\n });\n}\n","import { DOCUMENT } from '@angular/common';\nimport { inject, Injectable, signal } from '@angular/core';\n\nimport { AFRICANIES_THEME_KEY, STORAGE_TOKEN } from '@africanies/africanies-storage';\n\nimport type { Theme } from './theme.types';\n\n/**\n * Application light/dark theme preference.\n *\n * WHY signals (not BehaviorSubject): theme is synchronous UI state read from\n * templates and other services; a signal avoids RxJS subscription boilerplate\n * and matches Angular 22 change detection. Persistence goes through\n * {@link STORAGE_TOKEN} so tests can swap storage without touching `localStorage`.\n *\n * Applies the Tailwind `darkMode: 'class'` contract by toggling `dark` on\n * `document.documentElement`, and sets `color-scheme` so native UI (date\n * pickers, scrollbars, form controls) matches the app theme — class-based\n * dark mode alone does not restyle browser chrome.\n *\n * @example\n * ```ts\n * // app.config.ts\n * import { inject, provideAppInitializer } from '@angular/core';\n * import { ThemeService } from '@africanies/africanies-theme';\n *\n * export const appConfig = {\n * providers: [\n * provideAppInitializer(() => {\n * inject(ThemeService); // applies stored / system theme once\n * }),\n * ],\n * };\n *\n * // In a component\n * const theme = inject(ThemeService);\n * theme.toggle();\n * theme.setTheme('dark');\n * const current = theme.theme(); // 'light' | 'dark'\n * ```\n */\n@Injectable({ providedIn: 'root' })\nexport class ThemeService {\n private readonly storage = inject(STORAGE_TOKEN);\n private readonly document = inject(DOCUMENT);\n\n /**\n * Current theme. Prefer reading via `theme()` in templates / computed values\n * rather than caching the string, so dark-class consumers stay in sync.\n */\n readonly theme = signal<Theme>(this.resolveInitialTheme());\n\n constructor() {\n this.applyToDocument(this.theme());\n }\n\n /**\n * Sets and persists the theme, updating the `dark` class and `color-scheme`\n * on `<html>`.\n *\n * @param theme - Absolute preference to store.\n */\n setTheme(theme: Theme): void {\n this.theme.set(theme);\n this.applyToDocument(theme);\n try {\n this.storage.set(AFRICANIES_THEME_KEY, theme);\n } catch {\n // Persistence failure must not block the in-session visual toggle —\n // private browsing / quota issues are transient for theme preference.\n }\n }\n\n /**\n * Flips between light and dark.\n *\n * @returns The theme after the toggle.\n */\n toggle(): Theme {\n const next: Theme = this.theme() === 'light' ? 'dark' : 'light';\n this.setTheme(next);\n return next;\n }\n\n private resolveInitialTheme(): Theme {\n try {\n const stored = this.storage.get<Theme>(AFRICANIES_THEME_KEY);\n if (stored === 'light' || stored === 'dark') {\n return stored;\n }\n } catch {\n // Fall through to system preference when storage is unavailable.\n }\n return this.prefersDark() ? 'dark' : 'light';\n }\n\n private prefersDark(): boolean {\n const win = this.document.defaultView;\n return !!win?.matchMedia?.('(prefers-color-scheme: dark)').matches;\n }\n\n private applyToDocument(theme: Theme): void {\n const root = this.document.documentElement;\n if (theme === 'dark') {\n root.classList.add('dark');\n } else {\n root.classList.remove('dark');\n }\n // Native date/time pickers follow `color-scheme`, not Tailwind's `dark` class.\n root.style.colorScheme = theme;\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"africanies-africanies-theme.mjs","sources":["../../../../libs/africanies-theme/src/lib/mode-color.safelist.ts","../../../../libs/africanies-theme/src/lib/mode-color.service.ts","../../../../libs/africanies-theme/src/lib/theme.service.ts","../../../../libs/africanies-theme/src/africanies-africanies-theme.ts"],"sourcesContent":["/**\n * Tailwind safelist side-effect for shipping-mode color utilities.\n *\n * WHY this file exists: JIT/content scanning only keeps class names that appear\n * as *literal strings* in scanned sources. {@link ModeColorService} already\n * returns these literals, but keeping a dedicated comment list makes the\n * contract obvious for consumers who configure `safelist` or purge plugins.\n *\n * Do not rename these strings without updating ModeColorService and THEME.md.\n *\n * SFN (export / green):\n * text-export-strong bg-export-strong hover:bg-export-hover border-export-strong\n * text-export bg-export bg-export-subtle bg-export-light border-export\n * hover:bg-export-light hover:bg-export-subtle dark:bg-export/15 dark:hover:bg-export/15\n * dark:bg-[color-mix(in_srgb,#1cbd5d_15%,#212529)] dark:bg-export dark:text-export dark:border-export\n *\n * STN (import / orange):\n * text-import-strong bg-import-strong hover:bg-import-hover border-import-strong\n * text-import bg-import bg-import-subtle bg-import-light border-import\n * hover:bg-import-light hover:bg-import-subtle dark:bg-import/15 dark:hover:bg-import/15\n * dark:bg-[color-mix(in_srgb,#f08829_15%,#212529)] dark:bg-import dark:text-import dark:border-import\n */\nexport const MODE_COLOR_SAFELIST = [\n 'text-export',\n 'text-export-strong',\n 'bg-export',\n 'bg-export-strong',\n 'bg-export-subtle',\n 'bg-export-light',\n 'border-export',\n 'border-export-strong',\n 'hover:bg-export-hover',\n 'hover:bg-export-light',\n 'hover:bg-export-subtle',\n 'dark:bg-export/15',\n 'dark:hover:bg-export/15',\n 'dark:hover:bg-export-light',\n 'dark:bg-[color-mix(in_srgb,#1cbd5d_15%,#212529)]',\n 'dark:bg-export',\n 'dark:text-export',\n 'dark:border-export',\n 'text-import',\n 'text-import-strong',\n 'bg-import',\n 'bg-import-strong',\n 'bg-import-subtle',\n 'bg-import-light',\n 'border-import',\n 'border-import-strong',\n 'hover:bg-import-hover',\n 'hover:bg-import-light',\n 'hover:bg-import-subtle',\n 'dark:bg-import/15',\n 'dark:hover:bg-import/15',\n 'dark:hover:bg-import-light',\n 'dark:bg-[color-mix(in_srgb,#f08829_15%,#212529)]',\n 'dark:bg-import',\n 'dark:text-import',\n 'dark:border-import',\n] as const;\n","import { computed, inject, Injectable } from '@angular/core';\n\nimport { ShippingModeService } from '@africanies/africanies-core';\n\n/**\n * Tailwind class bundle for the active shipping mode (SFN export / STN import).\n *\n * Use these for **primary** product chrome: CTAs, selected controls, progress,\n * and accent text. Semantic colors (danger / warning) stay mode-independent.\n */\nexport interface ModeColorClasses {\n /** Accessible accent text — `text-export-strong` in light, `text-export` in dark. */\n text: string;\n /** Solid background utility, e.g. `bg-export`. */\n bg: string;\n /** Soft background utility, e.g. `bg-export-subtle`. */\n bgSubtle: string;\n /** Border matching the mode accent, e.g. `border-export`. */\n border: string;\n /**\n * Filled primary CTA — `variant=\"primary\"` on buttons.\n * Includes hover utility as a literal so Tailwind keeps it.\n */\n primary: string;\n /**\n * Transparent / text-only CTA — `variant=\"ghost-primary\"` on buttons.\n * Mode accent text + soft hover fill.\n */\n ghostPrimary: string;\n /**\n * Soft highlight for selected / active rows (works in dark mode).\n * Dark uses a translucent tint — fine over solid surfaces, not for\n * sticky overlays (see {@link softSolid}).\n */\n soft: string;\n /**\n * Opaque soft fill — same tint as {@link soft}, but dark mode mixes into\n * ink so scrolled content cannot show through (sticky table headers/cells).\n */\n softSolid: string;\n /**\n * Soft hover highlight for menus and lists.\n */\n softHover: string;\n /**\n * Active nav leaf / collapsed rail — solid mode fill + white text.\n */\n activeFill: string;\n /**\n * Stroked secondary CTA — white fill, mode border + text (portal `.btn-stroked`).\n */\n stroked: string;\n}\n\n/**\n * Maps {@link ShippingModeService} to mode-accent Tailwind classes.\n *\n * - **SFN** → export green is primary\n * - **STN** → import orange is primary\n *\n * WHY literal class strings: Tailwind's scanner cannot see dynamically built\n * names like `` `text-${token}` ``. Returning full literals (`text-export`, …)\n * keeps utilities in the compiled CSS. See {@link MODE_COLOR_SAFELIST}.\n *\n * @example\n * ```html\n * @let colors = modeColor.classes();\n * <button type=\"button\" [class]=\"colors.primary\">Save</button>\n * <span [class]=\"colors.text\">Mode accent</span>\n * ```\n */\n@Injectable({ providedIn: 'root' })\nexport class ModeColorService {\n private readonly shippingMode = inject(ShippingModeService);\n\n /**\n * Mode-dependent utility classes. Recomputes when shipping mode changes.\n */\n readonly classes = computed<ModeColorClasses>(() => {\n // Literal strings required for Tailwind content detection — do not interpolate.\n if (this.shippingMode.mode() === 'sfn') {\n return {\n text: 'text-export-strong dark:text-export',\n bg: 'bg-export',\n bgSubtle: 'bg-export-subtle',\n border: 'border-export',\n primary:\n 'bg-export-strong text-white border-transparent hover:bg-export-hover dark:bg-export dark:hover:bg-export-light',\n ghostPrimary:\n 'bg-transparent text-export-strong border-transparent hover:bg-export-subtle dark:text-export dark:hover:bg-export/15',\n soft: 'bg-export-subtle dark:bg-export/15',\n softSolid:\n 'bg-export-subtle dark:bg-[color-mix(in_srgb,#1cbd5d_15%,#212529)]',\n softHover: 'hover:bg-export-subtle dark:hover:bg-export/15',\n activeFill:\n 'bg-export-strong text-white border-transparent hover:bg-export-hover dark:bg-export dark:text-white dark:hover:bg-export-light',\n stroked:\n 'bg-surface text-export-strong border-export-strong hover:bg-export-subtle dark:bg-ink-950 dark:text-export dark:border-export dark:hover:bg-export/15',\n };\n }\n return {\n text: 'text-import-strong dark:text-import',\n bg: 'bg-import',\n bgSubtle: 'bg-import-subtle',\n border: 'border-import',\n primary:\n 'bg-import-strong text-white border-transparent hover:bg-import-hover dark:bg-import dark:hover:bg-import-light',\n ghostPrimary:\n 'bg-transparent text-import-strong border-transparent hover:bg-import-subtle dark:text-import dark:hover:bg-import/15',\n soft: 'bg-import-subtle dark:bg-import/15',\n softSolid:\n 'bg-import-subtle dark:bg-[color-mix(in_srgb,#f08829_15%,#212529)]',\n softHover: 'hover:bg-import-subtle dark:hover:bg-import/15',\n activeFill:\n 'bg-import-strong text-white border-transparent hover:bg-import-hover dark:bg-import dark:text-white dark:hover:bg-import-light',\n stroked:\n 'bg-surface text-import-strong border-import-strong hover:bg-import-subtle dark:bg-ink-950 dark:text-import dark:border-import dark:hover:bg-import/15',\n };\n });\n}\n","import { DOCUMENT } from '@angular/common';\nimport { inject, Injectable, signal } from '@angular/core';\n\nimport { AFRICANIES_THEME_KEY, STORAGE_TOKEN } from '@africanies/africanies-storage';\n\nimport type { Theme } from './theme.types';\n\n/**\n * Application light/dark theme preference.\n *\n * WHY signals (not BehaviorSubject): theme is synchronous UI state read from\n * templates and other services; a signal avoids RxJS subscription boilerplate\n * and matches Angular 22 change detection. Persistence goes through\n * {@link STORAGE_TOKEN} so tests can swap storage without touching `localStorage`.\n *\n * Applies the Tailwind `darkMode: 'class'` contract by toggling `dark` on\n * `document.documentElement`, and sets `color-scheme` so native UI (date\n * pickers, scrollbars, form controls) matches the app theme — class-based\n * dark mode alone does not restyle browser chrome.\n *\n * @example\n * ```ts\n * // app.config.ts\n * import { inject, provideAppInitializer } from '@angular/core';\n * import { ThemeService } from '@africanies/africanies-theme';\n *\n * export const appConfig = {\n * providers: [\n * provideAppInitializer(() => {\n * inject(ThemeService); // applies stored / system theme once\n * }),\n * ],\n * };\n *\n * // In a component\n * const theme = inject(ThemeService);\n * theme.toggle();\n * theme.setTheme('dark');\n * const current = theme.theme(); // 'light' | 'dark'\n * ```\n */\n@Injectable({ providedIn: 'root' })\nexport class ThemeService {\n private readonly storage = inject(STORAGE_TOKEN);\n private readonly document = inject(DOCUMENT);\n\n /**\n * Current theme. Prefer reading via `theme()` in templates / computed values\n * rather than caching the string, so dark-class consumers stay in sync.\n */\n readonly theme = signal<Theme>(this.resolveInitialTheme());\n\n constructor() {\n this.applyToDocument(this.theme());\n }\n\n /**\n * Sets and persists the theme, updating the `dark` class and `color-scheme`\n * on `<html>`.\n *\n * @param theme - Absolute preference to store.\n */\n setTheme(theme: Theme): void {\n this.theme.set(theme);\n this.applyToDocument(theme);\n try {\n this.storage.set(AFRICANIES_THEME_KEY, theme);\n } catch {\n // Persistence failure must not block the in-session visual toggle —\n // private browsing / quota issues are transient for theme preference.\n }\n }\n\n /**\n * Flips between light and dark.\n *\n * @returns The theme after the toggle.\n */\n toggle(): Theme {\n const next: Theme = this.theme() === 'light' ? 'dark' : 'light';\n this.setTheme(next);\n return next;\n }\n\n private resolveInitialTheme(): Theme {\n try {\n const stored = this.storage.get<Theme>(AFRICANIES_THEME_KEY);\n if (stored === 'light' || stored === 'dark') {\n return stored;\n }\n } catch {\n // Fall through to system preference when storage is unavailable.\n }\n return this.prefersDark() ? 'dark' : 'light';\n }\n\n private prefersDark(): boolean {\n const win = this.document.defaultView;\n return !!win?.matchMedia?.('(prefers-color-scheme: dark)').matches;\n }\n\n private applyToDocument(theme: Theme): void {\n const root = this.document.documentElement;\n if (theme === 'dark') {\n root.classList.add('dark');\n } else {\n root.classList.remove('dark');\n }\n // Native date/time pickers follow `color-scheme`, not Tailwind's `dark` class.\n root.style.colorScheme = theme;\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -92,8 +92,8 @@ function africaniesAutofillPlugin({ addBase }) {
|
|
|
92
92
|
const rules = {};
|
|
93
93
|
for (const selector of autofillSelectors) {
|
|
94
94
|
rules[selector] = {
|
|
95
|
-
WebkitTextFillColor: '#
|
|
96
|
-
caretColor: '#
|
|
95
|
+
WebkitTextFillColor: '#172033',
|
|
96
|
+
caretColor: '#172033',
|
|
97
97
|
boxShadow: '0 0 0 1000px #ffffff inset',
|
|
98
98
|
transition: 'background-color 99999s ease-in-out 0s',
|
|
99
99
|
};
|
|
@@ -143,6 +143,36 @@ function africaniesOverlayStackPlugin({ addBase }) {
|
|
|
143
143
|
});
|
|
144
144
|
}
|
|
145
145
|
|
|
146
|
+
/**
|
|
147
|
+
* Shared elevated card shell so list/detail pages keep one light-theme recipe.
|
|
148
|
+
*
|
|
149
|
+
* @param {import('tailwindcss/types/config').PluginAPI} api
|
|
150
|
+
*/
|
|
151
|
+
function africaniesSurfacePlugin({ addComponents }) {
|
|
152
|
+
addComponents({
|
|
153
|
+
'.africanies-card': {
|
|
154
|
+
borderRadius: '0.75rem',
|
|
155
|
+
borderWidth: '1px',
|
|
156
|
+
borderStyle: 'solid',
|
|
157
|
+
borderColor: '#dde3ea',
|
|
158
|
+
backgroundColor: '#ffffff',
|
|
159
|
+
padding: '1.25rem',
|
|
160
|
+
color: '#172033',
|
|
161
|
+
boxShadow:
|
|
162
|
+
'0 1px 2px rgb(23 32 51 / 0.04), 0 1px 3px rgb(23 32 51 / 0.06)',
|
|
163
|
+
'@media (min-width: 640px)': {
|
|
164
|
+
padding: '1.5rem',
|
|
165
|
+
},
|
|
166
|
+
},
|
|
167
|
+
'.dark .africanies-card': {
|
|
168
|
+
borderColor: 'rgba(255, 255, 255, 0.1)',
|
|
169
|
+
backgroundColor: '#272729',
|
|
170
|
+
color: '#ffffff',
|
|
171
|
+
boxShadow: 'none',
|
|
172
|
+
},
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
|
|
146
176
|
/**
|
|
147
177
|
* Keep overlay scrollbars off close buttons and other end-aligned chrome.
|
|
148
178
|
*
|
|
@@ -186,6 +216,7 @@ module.exports = {
|
|
|
186
216
|
africaniesSpinPlugin,
|
|
187
217
|
africaniesOverlayStackPlugin,
|
|
188
218
|
africaniesOverlayScrollPlugin,
|
|
219
|
+
africaniesSurfacePlugin,
|
|
189
220
|
africaniesAutofillPlugin,
|
|
190
221
|
],
|
|
191
222
|
theme: {
|
|
@@ -193,50 +224,86 @@ module.exports = {
|
|
|
193
224
|
colors: {
|
|
194
225
|
black: '#000000',
|
|
195
226
|
white: '#ffffff',
|
|
227
|
+
surface: {
|
|
228
|
+
DEFAULT: '#ffffff',
|
|
229
|
+
subtle: '#f8fafc',
|
|
230
|
+
hover: '#e9eef5',
|
|
231
|
+
sunken: '#eef2f6',
|
|
232
|
+
},
|
|
196
233
|
ink: {
|
|
197
|
-
|
|
234
|
+
// High-contrast cool navy for light-theme body and heading text.
|
|
235
|
+
DEFAULT: '#172033',
|
|
198
236
|
blue: '#192a3e',
|
|
199
|
-
brand: '#
|
|
237
|
+
brand: '#172033',
|
|
238
|
+
// Previous ink DEFAULT — dark elevated cards / panels (`dark:bg-ink-surface`).
|
|
239
|
+
surface: '#212529',
|
|
200
240
|
950: '#272729',
|
|
201
241
|
},
|
|
202
242
|
neutral: {
|
|
243
|
+
50: '#f8fafc',
|
|
244
|
+
100: '#eef2f6',
|
|
245
|
+
200: '#dde3ea',
|
|
203
246
|
300: '#c9d5e1',
|
|
247
|
+
// Keep 300/400 stable: they are the established dark-theme foregrounds.
|
|
204
248
|
400: '#a9b5cb',
|
|
205
|
-
|
|
249
|
+
500: '#667185',
|
|
250
|
+
600: '#526071',
|
|
251
|
+
700: '#3e4a59',
|
|
252
|
+
800: '#2c3644',
|
|
253
|
+
900: '#172033',
|
|
206
254
|
},
|
|
207
255
|
border: {
|
|
208
|
-
//
|
|
209
|
-
|
|
210
|
-
|
|
256
|
+
// Quiet card/divider chrome. Controls use the stronger `control` token.
|
|
257
|
+
DEFAULT: '#dde3ea',
|
|
258
|
+
strong: '#c4cdd8',
|
|
211
259
|
},
|
|
260
|
+
// 3.1:1 against white: visible enough for meaningful control boundaries.
|
|
261
|
+
control: '#8793a3',
|
|
262
|
+
focus: '#175cd3',
|
|
212
263
|
background: {
|
|
213
|
-
|
|
264
|
+
// Cooler canvas and a clearer inset level beneath white surfaces.
|
|
265
|
+
chrome: '#f4f6f8',
|
|
266
|
+
// Nested wells inside white cards.
|
|
267
|
+
well: '#eef2f6',
|
|
268
|
+
// Auth / welcome / soft hover.
|
|
269
|
+
welcome: '#f8fafc',
|
|
270
|
+
hover: '#e9eef5',
|
|
214
271
|
},
|
|
215
272
|
export: {
|
|
216
273
|
DEFAULT: '#1cbd5d',
|
|
217
274
|
light: '#24dc6d',
|
|
218
275
|
subtle: '#e4fff3',
|
|
219
276
|
tint: '#f2fff8',
|
|
277
|
+
// Accessible normal-text / white-text-control foreground (5.43:1).
|
|
278
|
+
strong: '#0b7a3e',
|
|
279
|
+
hover: '#096833',
|
|
220
280
|
},
|
|
221
281
|
import: {
|
|
222
282
|
DEFAULT: '#f08829',
|
|
223
283
|
light: '#ffa95b',
|
|
224
284
|
subtle: '#fffcef',
|
|
285
|
+
// Accessible normal-text / white-text-control foreground (6.20:1).
|
|
286
|
+
strong: '#9a4b0b',
|
|
287
|
+
hover: '#7f3e09',
|
|
225
288
|
},
|
|
226
289
|
danger: {
|
|
227
290
|
DEFAULT: '#ff001c',
|
|
228
|
-
dark: '#
|
|
291
|
+
dark: '#b4233c',
|
|
229
292
|
strong: '#C00B19',
|
|
230
293
|
subtle: '#FFF2F2',
|
|
231
294
|
},
|
|
232
295
|
warning: {
|
|
233
296
|
DEFAULT: '#DBB316',
|
|
234
|
-
dark: '#
|
|
297
|
+
dark: '#8a5a00',
|
|
235
298
|
subtle: '#FFF6E6',
|
|
236
299
|
},
|
|
300
|
+
info: {
|
|
301
|
+
DEFAULT: '#175cd3',
|
|
302
|
+
subtle: '#eff6ff',
|
|
303
|
+
},
|
|
237
304
|
},
|
|
238
305
|
fontFamily: {
|
|
239
|
-
sans: ['
|
|
306
|
+
sans: ['Inter', 'system-ui', 'sans-serif'],
|
|
240
307
|
},
|
|
241
308
|
fontSize: {
|
|
242
309
|
// PROVISIONAL — see THEME.md; sizes may tighten after design QA.
|
|
@@ -248,6 +315,16 @@ module.exports = {
|
|
|
248
315
|
'body-sm': ['0.875rem', { lineHeight: 1.4, fontWeight: 400 }],
|
|
249
316
|
caption: ['0.75rem', { lineHeight: 1.3, fontWeight: 400 }],
|
|
250
317
|
},
|
|
318
|
+
borderRadius: {
|
|
319
|
+
control: '0.5rem',
|
|
320
|
+
panel: '0.75rem',
|
|
321
|
+
},
|
|
322
|
+
boxShadow: {
|
|
323
|
+
card:
|
|
324
|
+
'0 1px 2px rgb(23 32 51 / 0.04), 0 1px 3px rgb(23 32 51 / 0.06)',
|
|
325
|
+
floating:
|
|
326
|
+
'0 12px 32px rgb(23 32 51 / 0.12), 0 2px 8px rgb(23 32 51 / 0.06)',
|
|
327
|
+
},
|
|
251
328
|
},
|
|
252
329
|
},
|
|
253
330
|
};
|
|
@@ -11,16 +11,18 @@ import * as i0 from '@angular/core';
|
|
|
11
11
|
* Do not rename these strings without updating ModeColorService and THEME.md.
|
|
12
12
|
*
|
|
13
13
|
* SFN (export / green):
|
|
14
|
+
* text-export-strong bg-export-strong hover:bg-export-hover border-export-strong
|
|
14
15
|
* text-export bg-export bg-export-subtle bg-export-light border-export
|
|
15
16
|
* hover:bg-export-light hover:bg-export-subtle dark:bg-export/15 dark:hover:bg-export/15
|
|
16
|
-
* dark:bg-[color-mix(in_srgb,#1cbd5d_15%,#212529)]
|
|
17
|
+
* dark:bg-[color-mix(in_srgb,#1cbd5d_15%,#212529)] dark:bg-export dark:text-export dark:border-export
|
|
17
18
|
*
|
|
18
19
|
* STN (import / orange):
|
|
20
|
+
* text-import-strong bg-import-strong hover:bg-import-hover border-import-strong
|
|
19
21
|
* text-import bg-import bg-import-subtle bg-import-light border-import
|
|
20
22
|
* hover:bg-import-light hover:bg-import-subtle dark:bg-import/15 dark:hover:bg-import/15
|
|
21
|
-
* dark:bg-[color-mix(in_srgb,#f08829_15%,#212529)]
|
|
23
|
+
* dark:bg-[color-mix(in_srgb,#f08829_15%,#212529)] dark:bg-import dark:text-import dark:border-import
|
|
22
24
|
*/
|
|
23
|
-
declare const MODE_COLOR_SAFELIST: readonly ["text-export", "bg-export", "bg-export-subtle", "bg-export-light", "border-export", "hover:bg-export-light", "hover:bg-export-subtle", "dark:bg-export/15", "dark:hover:bg-export/15", "dark:bg-[color-mix(in_srgb,#1cbd5d_15%,#212529)]", "text-import", "bg-import", "bg-import-subtle", "bg-import-light", "border-import", "hover:bg-import-light", "hover:bg-import-subtle", "dark:bg-import/15", "dark:hover:bg-import/15", "dark:bg-[color-mix(in_srgb,#f08829_15%,#212529)]"];
|
|
25
|
+
declare const MODE_COLOR_SAFELIST: readonly ["text-export", "text-export-strong", "bg-export", "bg-export-strong", "bg-export-subtle", "bg-export-light", "border-export", "border-export-strong", "hover:bg-export-hover", "hover:bg-export-light", "hover:bg-export-subtle", "dark:bg-export/15", "dark:hover:bg-export/15", "dark:hover:bg-export-light", "dark:bg-[color-mix(in_srgb,#1cbd5d_15%,#212529)]", "dark:bg-export", "dark:text-export", "dark:border-export", "text-import", "text-import-strong", "bg-import", "bg-import-strong", "bg-import-subtle", "bg-import-light", "border-import", "border-import-strong", "hover:bg-import-hover", "hover:bg-import-light", "hover:bg-import-subtle", "dark:bg-import/15", "dark:hover:bg-import/15", "dark:hover:bg-import-light", "dark:bg-[color-mix(in_srgb,#f08829_15%,#212529)]", "dark:bg-import", "dark:text-import", "dark:border-import"];
|
|
24
26
|
|
|
25
27
|
/**
|
|
26
28
|
* Tailwind class bundle for the active shipping mode (SFN export / STN import).
|
|
@@ -29,7 +31,7 @@ declare const MODE_COLOR_SAFELIST: readonly ["text-export", "bg-export", "bg-exp
|
|
|
29
31
|
* and accent text. Semantic colors (danger / warning) stay mode-independent.
|
|
30
32
|
*/
|
|
31
33
|
interface ModeColorClasses {
|
|
32
|
-
/**
|
|
34
|
+
/** Accessible accent text — `text-export-strong` in light, `text-export` in dark. */
|
|
33
35
|
text: string;
|
|
34
36
|
/** Solid background utility, e.g. `bg-export`. */
|
|
35
37
|
bg: string;
|
|
@@ -62,6 +64,14 @@ interface ModeColorClasses {
|
|
|
62
64
|
* Soft hover highlight for menus and lists.
|
|
63
65
|
*/
|
|
64
66
|
softHover: string;
|
|
67
|
+
/**
|
|
68
|
+
* Active nav leaf / collapsed rail — solid mode fill + white text.
|
|
69
|
+
*/
|
|
70
|
+
activeFill: string;
|
|
71
|
+
/**
|
|
72
|
+
* Stroked secondary CTA — white fill, mode border + text (portal `.btn-stroked`).
|
|
73
|
+
*/
|
|
74
|
+
stroked: string;
|
|
65
75
|
}
|
|
66
76
|
/**
|
|
67
77
|
* Maps {@link ShippingModeService} to mode-accent Tailwind classes.
|