├── CHANGELOG.md ├── src ├── Facades │ └── FilamentTableRepeatableEntry.php ├── FilamentTableRepeatableEntryServiceProvider.php └── Infolists │ └── Components │ └── TableRepeatableEntry.php ├── package.json ├── LICENSE.md ├── resources ├── css │ └── table-repeatable-entry.css └── views │ └── table-repeatable-entry.blade.php ├── composer.json ├── README.md └── dist └── css └── table-repeatable-entry.css /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | All notable changes to `filament-table-repeatable-entry` will be documented in this file. 4 | -------------------------------------------------------------------------------- /src/Facades/FilamentTableRepeatableEntry.php: -------------------------------------------------------------------------------- 1 | 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in 13 | all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | THE SOFTWARE. 22 | -------------------------------------------------------------------------------- /src/FilamentTableRepeatableEntryServiceProvider.php: -------------------------------------------------------------------------------- 1 | name('filament-table-repeatable-entry') 21 | ->hasViews(); 22 | } 23 | 24 | public function boot() 25 | { 26 | $this->registerAssets(); 27 | 28 | $this->bootLoaders(); 29 | } 30 | 31 | protected function bootLoaders() 32 | { 33 | $this->loadViewsFrom(__DIR__ . '/../resources/views', 'filament-table-repeatable-entry'); 34 | $this->loadTranslationsFrom(__DIR__ . '/../lang', 'filament-table-repeatable-entry'); 35 | } 36 | 37 | protected function registerAssets() 38 | { 39 | FilamentAsset::register([ 40 | Css::make('table-repeatable-entry', __DIR__ .'/../dist/css/table-repeatable-entry.css') 41 | ], 'filament-table-repeatable-entry'); 42 | } 43 | 44 | } 45 | -------------------------------------------------------------------------------- /resources/css/table-repeatable-entry.css: -------------------------------------------------------------------------------- 1 | @import 'tailwindcss'; 2 | 3 | @custom-variant dark (&:where(.dark, .dark *)); 4 | 5 | .it-table-repeatable{ 6 | @apply bg-white border border-gray-300 shadow-sm rounded-xl relative dark:bg-gray-800 dark:border-gray-600; 7 | 8 | & > div{ 9 | @apply gap-4; 10 | 11 | & > table{ 12 | @apply w-full table-auto divide-y divide-gray-200 text-start dark:divide-white/5 shadow rounded-xl; 13 | 14 | & > thead{ 15 | & >tr{ 16 | & .it-table-repeatable-index{ 17 | @apply px-3 py-4 sm:first-of-type:ps-6 sm:last-of-type:pe-6; 18 | } 19 | 20 | & .it-table-repeatable-header-cell{ 21 | @apply font-semibold text-gray-950 dark:text-white text-start py-4 sm:first-of-type:ps-3 sm:last-of-type:pe-3; 22 | } 23 | } 24 | 25 | } 26 | 27 | & > tbody{ 28 | @apply divide-y divide-gray-200 whitespace-nowrap dark:divide-white/5; 29 | 30 | & .it-table-repeatable-striped-row{ 31 | @apply bg-gray-50 dark:bg-white/5; 32 | } 33 | 34 | & > tr{ 35 | & > td{ 36 | @apply p-0 first-of-type:ps-1 last-of-type:pe-1 sm:first-of-type:ps-3 sm:last-of-type:pe-3 text-center py-2 37 | } 38 | 39 | } 40 | } 41 | } 42 | } 43 | } -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "icetalker/filament-table-repeatable-entry", 3 | "description": "Display Filament RepeatableEntry as table", 4 | "keywords": [ 5 | "icetalker", 6 | "laravel", 7 | "filament-table-repeatable-entry" 8 | ], 9 | "homepage": "https://github.com/icetalker/filament-table-repeatable-entry", 10 | "license": "MIT", 11 | "authors": [ 12 | { 13 | "name": "Martin Hwang", 14 | "email": "termlong.com@gmail.com", 15 | "role": "Developer" 16 | } 17 | ], 18 | "require": { 19 | "php": "^8.2", 20 | "filament/infolists":"^4.0", 21 | "spatie/laravel-package-tools": "^1.14.0", 22 | "illuminate/contracts": "^10.0|^11.0|^12.0" 23 | }, 24 | "require-dev": { 25 | "laravel/pint": "^1.0", 26 | "nunomaduro/collision": "^7.9", 27 | "orchestra/testbench": "^8.0", 28 | "pestphp/pest": "^2.0", 29 | "pestphp/pest-plugin-arch": "^2.0", 30 | "pestphp/pest-plugin-laravel": "^2.0" 31 | }, 32 | "autoload": { 33 | "psr-4": { 34 | "Icetalker\\FilamentTableRepeatableEntry\\": "src", 35 | "Icetalker\\FilamentTableRepeatableEntry\\Database\\Factories\\": "database/factories" 36 | } 37 | }, 38 | "autoload-dev": { 39 | "psr-4": { 40 | "Icetalker\\FilamentTableRepeatableEntry\\Tests\\": "tests" 41 | } 42 | }, 43 | "scripts": { 44 | "post-autoload-dump": "@php ./vendor/bin/testbench package:discover --ansi", 45 | "analyse": "vendor/bin/phpstan analyse", 46 | "test": "vendor/bin/pest", 47 | "test-coverage": "vendor/bin/pest --coverage", 48 | "format": "vendor/bin/pint" 49 | }, 50 | "config": { 51 | "sort-packages": true, 52 | "allow-plugins": { 53 | "pestphp/pest-plugin": true, 54 | "phpstan/extension-installer": true 55 | } 56 | }, 57 | "extra": { 58 | "laravel": { 59 | "providers": [ 60 | "Icetalker\\FilamentTableRepeatableEntry\\FilamentTableRepeatableEntryServiceProvider" 61 | ], 62 | "aliases": { 63 | "FilamentTableRepeatableEntry": "Icetalker\\FilamentTableRepeatableEntry\\Facades\\FilamentTableRepeatableEntry" 64 | } 65 | } 66 | }, 67 | "minimum-stability": "dev", 68 | "prefer-stable": true 69 | } -------------------------------------------------------------------------------- /src/Infolists/Components/TableRepeatableEntry.php: -------------------------------------------------------------------------------- 1 | columnSpanFull(); 28 | } 29 | 30 | public function getColumnLabels(): array|null 31 | { 32 | $this->setColumnLabels(); 33 | 34 | return $this->columnLabels; 35 | } 36 | 37 | public function setColumnLabels(): void 38 | { 39 | $components = $this->getChildComponents(); 40 | 41 | foreach ($components as $component) { 42 | $this->columnLabels[] = [ 43 | 'component' => method_exists($component, 'getName') ? $component->getName(): null, 44 | 'name' => $component->getLabel(), 45 | 'alignment' => method_exists($component, 'getAlignment') ? $component->getAlignment(): null 46 | ]; 47 | } 48 | } 49 | 50 | public function childComponents(array | Schema | Component | Action | ActionGroup | string | Htmlable | Closure | null $components, string $key = 'default'): static 51 | { 52 | foreach ($components as $component) { 53 | $component->hiddenLabel(); //Disable Label, only show Entries inside table 54 | $this->childComponents[$key][] = $component; 55 | 56 | } 57 | 58 | return $this; 59 | } 60 | 61 | public function striped(bool $striped = true): static 62 | { 63 | $this->striped = $striped; 64 | 65 | return $this; 66 | } 67 | 68 | public function getStriped(): bool{ 69 | return $this->striped; 70 | } 71 | 72 | public function showIndex(bool $showIndex = true): static 73 | { 74 | $this-> showIndex = $showIndex; 75 | return $this; 76 | } 77 | 78 | public function getShowIndex(): bool 79 | { 80 | return $this->showIndex; 81 | } 82 | } 83 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Display Filament RepeatableEntry as table 2 | 3 | [![Latest Version on Packagist](https://img.shields.io/packagist/v/icetalker/filament-table-repeatable-entry.svg?style=flat-square)](https://packagist.org/packages/icetalker/filament-table-repeatable-entry) 4 | [![GitHub Tests Action Status](https://img.shields.io/github/actions/workflow/status/icetalker/filament-table-repeatable-entry/run-tests.yml?branch=main&label=tests&style=flat-square)](https://github.com/icetalker/filament-table-repeatable-entry/actions?query=workflow%3Arun-tests+branch%3Amain) 5 | [![GitHub Code Style Action Status](https://img.shields.io/github/actions/workflow/status/icetalker/filament-table-repeatable-entry/fix-php-code-style-issues.yml?branch=main&label=code%20style&style=flat-square)](https://github.com/icetalker/filament-table-repeatable-entry/actions?query=workflow%3A"Fix+PHP+code+style+issues"+branch%3Amain) 6 | [![Total Downloads](https://img.shields.io/packagist/dt/icetalker/filament-table-repeatable-entry.svg?style=flat-square)](https://packagist.org/packages/icetalker/filament-table-repeatable-entry) 7 | 8 | This is a Filament Infolists Component, use for display RepetableEntry as a table. In case you are using [TableRepeater]() instead of RelationManager. 9 | 10 | ## Installation 11 | 12 | You can install the package via composer: 13 | 14 | ```bash 15 | composer require icetalker/filament-table-repeatable-entry 16 | ``` 17 | 18 | ## Usage 19 | 20 | ```php 21 | namespace Icetalker\FilamentTableRepeater\Infolists\Components; 22 | 23 | TableRepeatableEntry::make('items') 24 | ->schema([ 25 | Infolists\Components\TextEntry::make('product'), 26 | Infolists\Components\TextEntry::make('quantity'), 27 | Infolists\Components\TextEntry::make('price'), 28 | ]) 29 | ->columnSpan(2), 30 | ``` 31 | 32 | ### Striped Row 33 | 34 | To enable striped table rows, you can use the `striped()` method: 35 | 36 | ```php 37 | namespace Icetalker\FilamentTableRepeater\Forms\Components; 38 | 39 | TableRepeatableEntry::make('items') 40 | ->schema([ 41 | Infolists\Components\TextEntry::make('product'), 42 | Infolists\Components\TextEntry::make('quantity'), 43 | Infolists\Components\TextEntry::make('price'), 44 | ]) 45 | ->striped() 46 | ->columnSpan(2), 47 | ``` 48 | 49 | ### Show Index 50 | 51 | To show table row index, please use `showIncdex()`: 52 | 53 | ```php 54 | namespace Icetalker\FilamentTableRepeater\Forms\Components; 55 | 56 | TableRepeatableEntry::make('items') 57 | ->schema([ 58 | Infolists\Components\TextEntry::make('product'), 59 | Infolists\Components\TextEntry::make('quantity'), 60 | Infolists\Components\TextEntry::make('price'), 61 | ]) 62 | ->striped() 63 | ->columnSpan(2), 64 | ``` 65 | 66 | 67 | ## Changelog 68 | 69 | Please see [CHANGELOG](CHANGELOG.md) for more information on what has changed recently. 70 | 71 | ## Contributing 72 | 73 | Please see [CONTRIBUTING](CONTRIBUTING.md) for details. 74 | 75 | ## Security Vulnerabilities 76 | 77 | Please review [our security policy](../../security/policy) on how to report security vulnerabilities. 78 | 79 | ## Credits 80 | 81 | - [Martin Hwang](https://github.com/icetalker) 82 | - [All Contributors](../../contributors) 83 | 84 | ## License 85 | 86 | The MIT License (MIT). Please see [License File](LICENSE.md) for more information. 87 | -------------------------------------------------------------------------------- /resources/views/table-repeatable-entry.blade.php: -------------------------------------------------------------------------------- 1 | @php 2 | use Filament\Support\Enums\Alignment; 3 | 4 | $isContained = $isContained(); 5 | $striped = $getStriped(); 6 | $showIndex = $getShowIndex(); 7 | @endphp 8 | 9 | 10 |
merge([ 15 | 'id' => $getId(), 16 | ], escape: false) 17 | ->merge($getExtraAttributes(), escape: false) 18 | ->class(['it-table-repeatable']) 19 | }} 20 | > 21 |
22 | 23 | 24 | 25 | @if($showIndex)@endif 26 | @foreach($getColumnLabels() as $label) 27 | @php 28 | $alignment = $label['alignment']; 29 | if (! $alignment instanceof Alignment) { 30 | $alignment = filled($alignment) ? (Alignment::tryFrom($alignment) ?? $alignment) : null; 31 | } 32 | @endphp 33 | 54 | @endforeach 55 | 56 | 57 | 58 | @foreach ($getChildComponentContainers() as $item) 59 | 60 | @if($showIndex)@endif 61 | 62 | @foreach($item->getComponents() as $component) 63 | 66 | @endforeach 67 | 68 | 69 | @endforeach 70 | 71 |
'text-start', 38 | Alignment::Center => 'text-center', 39 | Alignment::End => 'text-end', 40 | Alignment::Left => 'text-left', 41 | Alignment::Right => 'text-right', 42 | Alignment::Justify, Alignment::Between => 'text-justify', 43 | default => $alignment, 44 | }, 45 | match ($alignment) { 46 | Alignment::Start, Alignment::Left => 'justify-start', 47 | Alignment::Center => 'justify-center', 48 | Alignment::End, Alignment::Right => 'justify-end', 49 | Alignment::Between, Alignment::Justify => 'justify-between', 50 | default => null, 51 | } 52 | ]) 53 | >{{ $label['name'] }}
{{ $loop->index + 1 }} 64 | {{ $component }} 65 |
72 |
73 |
74 |
-------------------------------------------------------------------------------- /dist/css/table-repeatable-entry.css: -------------------------------------------------------------------------------- 1 | /*! tailwindcss v4.1.11 | MIT License | https://tailwindcss.com */ 2 | @layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-border-style:solid;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-divide-y-reverse:0;--tw-font-weight:initial}}}@layer theme{:root,:host{--font-sans:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--color-gray-50:oklch(98.5% .002 247.839);--color-gray-200:oklch(92.8% .006 264.531);--color-gray-300:oklch(87.2% .01 258.338);--color-gray-600:oklch(44.6% .03 256.802);--color-gray-800:oklch(27.8% .033 256.848);--color-gray-950:oklch(13% .028 261.692);--color-white:#fff;--spacing:.25rem;--font-weight-semibold:600;--radius-xl:.75rem;--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.static{position:static}.table{display:table}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.justify-start{justify-content:flex-start}.py-2{padding-block:calc(var(--spacing)*2)}.text-center{text-align:center}.text-end{text-align:end}.text-justify{text-align:justify}.text-left{text-align:left}.text-right{text-align:right}.text-start{text-align:start}}.it-table-repeatable{border-radius:var(--radius-xl);border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-gray-300);background-color:var(--color-white);--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);position:relative}.it-table-repeatable:where(.dark,.dark *){border-color:var(--color-gray-600);background-color:var(--color-gray-800)}.it-table-repeatable>div{gap:calc(var(--spacing)*4)}.it-table-repeatable>div>table{table-layout:auto;width:100%}:where(.it-table-repeatable>div>table>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px*var(--tw-divide-y-reverse));border-bottom-width:calc(1px*calc(1 - var(--tw-divide-y-reverse)));border-color:var(--color-gray-200)}.it-table-repeatable>div>table{border-radius:var(--radius-xl);text-align:start;--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}:where(.it-table-repeatable>div>table:where(.dark,.dark *)>:not(:last-child)){border-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){:where(.it-table-repeatable>div>table:where(.dark,.dark *)>:not(:last-child)){border-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.it-table-repeatable>div>table>thead>tr .it-table-repeatable-index{padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*4)}@media (min-width:40rem){.it-table-repeatable>div>table>thead>tr .it-table-repeatable-index:first-of-type{padding-inline-start:calc(var(--spacing)*6)}.it-table-repeatable>div>table>thead>tr .it-table-repeatable-index:last-of-type{padding-inline-end:calc(var(--spacing)*6)}}.it-table-repeatable>div>table>thead>tr .it-table-repeatable-header-cell{padding-block:calc(var(--spacing)*4);text-align:start;--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold);color:var(--color-gray-950)}@media (min-width:40rem){.it-table-repeatable>div>table>thead>tr .it-table-repeatable-header-cell:first-of-type{padding-inline-start:calc(var(--spacing)*3)}.it-table-repeatable>div>table>thead>tr .it-table-repeatable-header-cell:last-of-type{padding-inline-end:calc(var(--spacing)*3)}}.it-table-repeatable>div>table>thead>tr .it-table-repeatable-header-cell:where(.dark,.dark *){color:var(--color-white)}:where(.it-table-repeatable>div>table>tbody>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px*var(--tw-divide-y-reverse));border-bottom-width:calc(1px*calc(1 - var(--tw-divide-y-reverse)));border-color:var(--color-gray-200)}.it-table-repeatable>div>table>tbody{white-space:nowrap}:where(.it-table-repeatable>div>table>tbody:where(.dark,.dark *)>:not(:last-child)){border-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){:where(.it-table-repeatable>div>table>tbody:where(.dark,.dark *)>:not(:last-child)){border-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.it-table-repeatable>div>table>tbody .it-table-repeatable-striped-row{background-color:var(--color-gray-50)}.it-table-repeatable>div>table>tbody .it-table-repeatable-striped-row:where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.it-table-repeatable>div>table>tbody .it-table-repeatable-striped-row:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.it-table-repeatable>div>table>tbody>tr>td{padding:calc(var(--spacing)*0);padding-block:calc(var(--spacing)*2);text-align:center}.it-table-repeatable>div>table>tbody>tr>td:first-of-type{padding-inline-start:calc(var(--spacing)*1)}.it-table-repeatable>div>table>tbody>tr>td:last-of-type{padding-inline-end:calc(var(--spacing)*1)}@media (min-width:40rem){.it-table-repeatable>div>table>tbody>tr>td:first-of-type{padding-inline-start:calc(var(--spacing)*3)}.it-table-repeatable>div>table>tbody>tr>td:last-of-type{padding-inline-end:calc(var(--spacing)*3)}}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-font-weight{syntax:"*";inherits:false} --------------------------------------------------------------------------------